@@ -63,58 +63,36 @@ def _validate(cls, __input_value: str, _: Any) -> str:
63
63
@staticmethod
64
64
def validate_mac_address (value : bytes ) -> str :
65
65
"""Validate a MAC Address from the provided byte value."""
66
- if len (value ) < 14 :
66
+ string = value .decode ()
67
+ if len (string ) < 14 :
67
68
raise PydanticCustomError (
68
69
'mac_address_len' ,
69
70
'Length for a {mac_address} MAC address must be {required_length}' ,
70
- {'mac_address' : value . decode () , 'required_length' : 14 },
71
+ {'mac_address' : string , 'required_length' : 14 },
71
72
)
72
-
73
- if value [2 ] in [ord (':' ), ord ('-' )]:
74
- if (len (value ) + 1 ) % 3 != 0 :
75
- raise PydanticCustomError (
76
- 'mac_address_format' , 'Must have the format xx:xx:xx:xx:xx:xx or xx-xx-xx-xx-xx-xx'
77
- )
78
- n = (len (value ) + 1 ) // 3
79
- if n not in (6 , 8 , 20 ):
80
- raise PydanticCustomError (
81
- 'mac_address_format' ,
82
- 'Length for a {mac_address} MAC address must be {required_length}' ,
83
- {'mac_address' : value .decode (), 'required_length' : (6 , 8 , 20 )},
84
- )
85
- mac_address = bytearray (n )
86
- x = 0
87
- for i in range (n ):
88
- try :
89
- byte_value = int (value [x : x + 2 ], 16 )
90
- mac_address [i ] = byte_value
91
- x += 3
92
- except ValueError as e :
93
- raise PydanticCustomError ('mac_address_format' , 'Unrecognized format' ) from e
94
-
95
- elif value [4 ] == ord ('.' ):
96
- if (len (value ) + 1 ) % 5 != 0 :
97
- raise PydanticCustomError ('mac_address_format' , 'Must have the format xx.xx.xx.xx.xx.xx' )
98
- n = 2 * (len (value ) + 1 ) // 5
99
- if n not in (6 , 8 , 20 ):
100
- raise PydanticCustomError (
101
- 'mac_address_format' ,
102
- 'Length for a {mac_address} MAC address must be {required_length}' ,
103
- {'mac_address' : value .decode (), 'required_length' : (6 , 8 , 20 )},
104
- )
105
- mac_address = bytearray (n )
106
- x = 0
107
- for i in range (0 , n , 2 ):
108
- try :
109
- byte_value = int (value [x : x + 2 ], 16 )
110
- mac_address [i ] = byte_value
111
- byte_value = int (value [x + 2 : x + 4 ], 16 )
112
- mac_address [i + 1 ] = byte_value
113
- x += 5
114
- except ValueError as e :
115
- raise PydanticCustomError ('mac_address_format' , 'Unrecognized format' ) from e
116
-
73
+ for sep , partbytes in ((':' , 2 ), ('-' , 2 ), ('.' , 4 )):
74
+ if sep in string :
75
+ parts = string .split (sep )
76
+ if any (len (part ) != partbytes for part in parts ):
77
+ raise PydanticCustomError (
78
+ 'mac_address_format' ,
79
+ f'Must have the format xx{ sep } xx{ sep } xx{ sep } xx{ sep } xx{ sep } xx' ,
80
+ )
81
+ if len (parts ) * partbytes // 2 not in (6 , 8 , 20 ):
82
+ raise PydanticCustomError (
83
+ 'mac_address_format' ,
84
+ 'Length for a {mac_address} MAC address must be {required_length}' ,
85
+ {'mac_address' : string , 'required_length' : (6 , 8 , 20 )},
86
+ )
87
+ mac_address = []
88
+ for part in parts :
89
+ for idx in range (0 , partbytes , 2 ):
90
+ try :
91
+ byte_value = int (part [idx : idx + 2 ], 16 )
92
+ except ValueError as exc :
93
+ raise PydanticCustomError ('mac_address_format' , 'Unrecognized format' ) from exc
94
+ else :
95
+ mac_address .append (byte_value )
96
+ return ':' .join (f'{ b :02x} ' for b in mac_address )
117
97
else :
118
98
raise PydanticCustomError ('mac_address_format' , 'Unrecognized format' )
119
-
120
- return ':' .join (f'{ b :02x} ' for b in mac_address )
0 commit comments