@@ -23,6 +23,7 @@ use crate::ParseError;
2323pub struct Carrier {
2424 pub mcc : u16 , // always 3 digits
2525 pub mnc : u16 , // 2 or 3 digits
26+ pub mnc_3 : bool ,
2627}
2728
2829impl TryFrom < & str > for Carrier {
@@ -38,13 +39,18 @@ impl TryFrom<&str> for Carrier {
3839 . get ( 3 ..)
3940 . and_then ( |c| c. parse ( ) . ok ( ) )
4041 . ok_or ( ParseError :: InvalidNetworkCode ) ?,
42+ mnc_3 : value. len ( ) == 6 ,
4143 } )
4244 }
4345}
4446
4547impl fmt:: Display for Carrier {
4648 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
47- write ! ( f, "{}{}" , self . mcc, self . mnc)
49+ if self . mnc_3 {
50+ write ! ( f, "{:03}{:03}" , self . mcc, self . mnc)
51+ } else {
52+ write ! ( f, "{:03}{:02}" , self . mcc, self . mnc)
53+ }
4854 }
4955}
5056
@@ -55,7 +61,21 @@ mod test {
5561
5662 #[ test]
5763 fn test_mobile_network_codes ( ) {
58- assert_eq ! ( Carrier { mcc: 336 , mnc: 1 } , "336001" . try_into( ) . unwrap( ) ) ;
59- assert_eq ! ( Carrier { mcc: 336 , mnc: 35 } , "33635" . try_into( ) . unwrap( ) ) ;
64+ assert_eq ! (
65+ Carrier {
66+ mcc: 336 ,
67+ mnc: 1 ,
68+ mnc_3: true
69+ } ,
70+ "336001" . try_into( ) . unwrap( )
71+ ) ;
72+ assert_eq ! (
73+ Carrier {
74+ mcc: 336 ,
75+ mnc: 35 ,
76+ mnc_3: false
77+ } ,
78+ "33635" . try_into( ) . unwrap( )
79+ ) ;
6080 }
61- }
81+ }
0 commit comments