@@ -18,7 +18,11 @@ pub enum ArrayKey<'a> {
1818impl From < String > for ArrayKey < ' _ > {
1919 fn from ( value : String ) -> Self {
2020 if let Ok ( index) = i64:: from_str ( value. as_str ( ) ) {
21- Self :: Long ( index)
21+ if value == "0" || !value. starts_with ( '0' ) {
22+ Self :: Long ( index)
23+ } else {
24+ Self :: String ( value)
25+ }
2226 } else {
2327 Self :: String ( value)
2428 }
@@ -77,7 +81,11 @@ impl Display for ArrayKey<'_> {
7781impl < ' a > From < & ' a str > for ArrayKey < ' a > {
7882 fn from ( value : & ' a str ) -> ArrayKey < ' a > {
7983 if let Ok ( index) = i64:: from_str ( value) {
80- Self :: Long ( index)
84+ if value == "0" || !value. starts_with ( '0' ) {
85+ ArrayKey :: Long ( index)
86+ } else {
87+ ArrayKey :: Str ( value)
88+ }
8189 } else {
8290 ArrayKey :: Str ( value)
8391 }
@@ -160,4 +168,30 @@ mod tests {
160168 assert ! ( result. is_err( ) ) ;
161169 assert ! ( matches!( result. unwrap_err( ) , Error :: InvalidProperty ) ) ;
162170 }
171+
172+ #[ test]
173+ fn test_from_str_with_leading_zeros ( ) {
174+ let key: ArrayKey = "00" . into ( ) ;
175+ assert_eq ! ( key, ArrayKey :: Str ( "00" ) ) ;
176+ let key: ArrayKey = "071" . into ( ) ;
177+ assert_eq ! ( key, ArrayKey :: Str ( "071" ) ) ;
178+ let key: ArrayKey = "0" . into ( ) ;
179+ assert_eq ! ( key, ArrayKey :: Long ( 0 ) ) ;
180+ }
181+
182+ #[ test]
183+ fn test_from_string_with_leading_zeros ( ) {
184+ let key = ArrayKey :: String ( "042" . to_string ( ) ) ;
185+ let result: crate :: error:: Result < String , _ > = key. try_into ( ) ;
186+ assert ! ( result. is_ok( ) ) ;
187+ assert_eq ! ( result. unwrap( ) , "042" ) ;
188+ let key = ArrayKey :: String ( "00" . to_string ( ) ) ;
189+ let result: crate :: error:: Result < String , _ > = key. try_into ( ) ;
190+ assert ! ( result. is_ok( ) ) ;
191+ assert_eq ! ( result. unwrap( ) , "00" ) ;
192+ let key = ArrayKey :: String ( "0" . to_string ( ) ) ;
193+ let result: crate :: error:: Result < i64 , _ > = key. try_into ( ) ;
194+ assert ! ( result. is_ok( ) ) ;
195+ assert_eq ! ( result. unwrap( ) , 0 ) ;
196+ }
163197}
0 commit comments