@@ -16,44 +16,35 @@ fn split_tag(input: &str) -> Option<(&str, &str)> {
1616// language-range = (1*8ALPHA *("-" 1*8alphanum)) / "*"
1717// alphanum = ALPHA / DIGIT
1818pub ( crate ) fn parse ( input : & str ) -> crate :: Result < LanguageRange > {
19- let tags = if input == "*" {
20- vec ! [ Cow :: from( input. to_string( ) ) ]
21- } else {
22- let mut tags = Vec :: new ( ) ;
19+ let mut tags = Vec :: new ( ) ;
20+
21+ let ( tag, mut input) = split_tag ( input) . ok_or_else ( || crate :: format_err!( "WIP error" ) ) ?;
22+ crate :: ensure!( !tag. is_empty( ) , "Language tag should not be empty" ) ;
23+ crate :: ensure!(
24+ tag. bytes( )
25+ . all( |b| ( b'a' ..=b'z' ) . contains( & b) || ( b'A' ..=b'Z' ) . contains( & b) ) ,
26+ "Language tag should be alpha"
27+ ) ;
28+ tags. push ( Cow :: from ( tag. to_string ( ) ) ) ;
2329
24- let ( tag, mut input) = split_tag ( input) . ok_or_else ( || crate :: format_err!( "WIP error" ) ) ?;
30+ while !input. is_empty ( ) {
31+ let ( tag, rest) = split_tag ( input) . ok_or_else ( || crate :: format_err!( "WIP error" ) ) ?;
2532 crate :: ensure!( !tag. is_empty( ) , "Language tag should not be empty" ) ;
2633 crate :: ensure!(
27- tag. bytes( )
28- . all( |b| ( b'a' ..=b'z' ) . contains( & b) || ( b'A' ..=b'Z' ) . contains( & b) ) ,
29- "Language tag should be alpha"
34+ tag. bytes( ) . all( |b| ( b'a' ..=b'z' ) . contains( & b)
35+ || ( b'A' ..=b'Z' ) . contains( & b)
36+ || ( b'0' ..=b'9' ) . contains( & b) ) ,
37+ "Language tag should be alpha numeric"
3038 ) ;
3139 tags. push ( Cow :: from ( tag. to_string ( ) ) ) ;
32-
33- while !input. is_empty ( ) {
34- let ( tag, rest) = split_tag ( input) . ok_or_else ( || crate :: format_err!( "WIP error" ) ) ?;
35- crate :: ensure!( !tag. is_empty( ) , "Language tag should not be empty" ) ;
36- crate :: ensure!(
37- tag. bytes( ) . all( |b| ( b'a' ..=b'z' ) . contains( & b)
38- || ( b'A' ..=b'Z' ) . contains( & b)
39- || ( b'0' ..=b'9' ) . contains( & b) ) ,
40- "Language tag should be alpha numeric"
41- ) ;
42- tags. push ( Cow :: from ( tag. to_string ( ) ) ) ;
43- input = rest;
44- }
45-
46- tags
47- } ;
40+ input = rest;
41+ }
4842
4943 Ok ( LanguageRange { tags } )
5044}
5145
5246#[ test]
5347fn test ( ) {
54- let range = parse ( "*" ) . unwrap ( ) ;
55- assert_eq ! ( & range. tags, & [ "*" ] ) ;
56-
5748 let range = parse ( "en" ) . unwrap ( ) ;
5849 assert_eq ! ( & range. tags, & [ "en" ] ) ;
5950
0 commit comments