2
2
// called LICENSE at the top level of the ICU4X source tree
3
3
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
4
5
- use crate :: LanguageIdentifier ;
5
+ use crate :: { LanguageIdentifier , Locale } ;
6
+ use core:: { fmt:: Display , marker:: PhantomData , str:: FromStr } ;
6
7
use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
8
+ use writeable:: Writeable ;
7
9
8
10
impl Serialize for LanguageIdentifier {
9
11
fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
10
12
where
11
13
S : Serializer ,
12
14
{
13
- serializer. serialize_str ( & self . to_string ( ) )
15
+ serializer. serialize_str ( & self . write_to_string ( ) )
14
16
}
15
17
}
16
18
17
- impl < ' de > Deserialize < ' de > for LanguageIdentifier {
18
- fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
19
+ impl Serialize for Locale {
20
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
19
21
where
20
- D : Deserializer < ' de > ,
22
+ S : Serializer ,
21
23
{
22
- struct LanguageIdentifierVisitor ;
24
+ serializer. serialize_str ( & self . write_to_string ( ) )
25
+ }
26
+ }
23
27
24
- impl serde:: de:: Visitor < ' _ > for LanguageIdentifierVisitor {
25
- type Value = LanguageIdentifier ;
28
+ struct ParseVisitor < T > ( PhantomData < T > ) ;
26
29
27
- fn expecting ( & self , formatter : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
28
- write ! ( formatter, "a valid Unicode Language Identifier" )
29
- }
30
+ impl < T > serde:: de:: Visitor < ' _ > for ParseVisitor < T >
31
+ where
32
+ T : FromStr ,
33
+ <T as FromStr >:: Err : Display ,
34
+ {
35
+ type Value = T ;
30
36
31
- fn visit_str < E > ( self , s : & str ) -> Result < Self :: Value , E >
32
- where
33
- E : serde:: de:: Error ,
34
- {
35
- s. parse :: < LanguageIdentifier > ( )
36
- . map_err ( serde:: de:: Error :: custom)
37
- }
38
- }
37
+ fn expecting ( & self , formatter : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
38
+ write ! ( formatter, "a valid Unicode Language or Locale Identifier" )
39
+ }
40
+
41
+ fn visit_str < E > ( self , s : & str ) -> Result < Self :: Value , E >
42
+ where
43
+ E : serde:: de:: Error ,
44
+ {
45
+ s. parse :: < T > ( ) . map_err ( serde:: de:: Error :: custom)
46
+ }
47
+ }
39
48
40
- deserializer. deserialize_string ( LanguageIdentifierVisitor )
49
+ impl < ' de > Deserialize < ' de > for LanguageIdentifier {
50
+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
51
+ where
52
+ D : Deserializer < ' de > ,
53
+ {
54
+ deserializer. deserialize_str ( ParseVisitor ( PhantomData ) )
55
+ }
56
+ }
57
+
58
+ impl < ' de > Deserialize < ' de > for Locale {
59
+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
60
+ where
61
+ D : Deserializer < ' de > ,
62
+ {
63
+ deserializer. deserialize_str ( ParseVisitor ( PhantomData ) )
41
64
}
42
65
}
43
66
44
67
#[ test]
45
68
fn json ( ) {
46
- use crate :: langid;
47
69
use crate :: subtags:: { Language , Region , Script } ;
70
+ use crate :: { langid, locale} ;
48
71
49
72
assert_eq ! (
50
73
serde_json:: to_string( & langid!( "en-US" ) ) . unwrap( ) ,
@@ -54,8 +77,26 @@ fn json() {
54
77
serde_json:: from_str:: <LanguageIdentifier >( r#""en-US""# ) . unwrap( ) ,
55
78
langid!( "en-US" )
56
79
) ;
80
+ assert_eq ! (
81
+ serde_json:: from_reader:: <_, LanguageIdentifier >( & br#""en-US""# [ ..] ) . unwrap( ) ,
82
+ langid!( "en-US" )
83
+ ) ;
57
84
assert ! ( serde_json:: from_str:: <LanguageIdentifier >( r#""2Xs""# ) . is_err( ) ) ;
58
85
86
+ assert_eq ! (
87
+ serde_json:: to_string( & locale!( "en-US-u-hc-h12" ) ) . unwrap( ) ,
88
+ r#""en-US-u-hc-h12""#
89
+ ) ;
90
+ assert_eq ! (
91
+ serde_json:: from_str:: <Locale >( r#""en-US-u-hc-h12""# ) . unwrap( ) ,
92
+ locale!( "en-US-u-hc-h12" )
93
+ ) ;
94
+ assert_eq ! (
95
+ serde_json:: from_reader:: <_, Locale >( & br#""en-US-u-hc-h12""# [ ..] ) . unwrap( ) ,
96
+ locale!( "en-US-u-hc-h12" )
97
+ ) ;
98
+ assert ! ( serde_json:: from_str:: <Locale >( r#""2Xs""# ) . is_err( ) ) ;
99
+
59
100
assert_eq ! (
60
101
serde_json:: to_string( & "fr" . parse:: <Language >( ) . unwrap( ) ) . unwrap( ) ,
61
102
r#""fr""#
@@ -64,6 +105,10 @@ fn json() {
64
105
serde_json:: from_str:: <Language >( r#""fr""# ) . unwrap( ) ,
65
106
"fr" . parse:: <Language >( ) . unwrap( )
66
107
) ;
108
+ assert_eq ! (
109
+ serde_json:: from_reader:: <_, Language >( & br#""fr""# [ ..] ) . unwrap( ) ,
110
+ "fr" . parse:: <Language >( ) . unwrap( )
111
+ ) ;
67
112
assert ! ( serde_json:: from_str:: <Language >( r#""2Xs""# ) . is_err( ) ) ;
68
113
69
114
assert_eq ! (
@@ -74,6 +119,10 @@ fn json() {
74
119
serde_json:: from_str:: <Script >( r#""Latn""# ) . unwrap( ) ,
75
120
"Latn" . parse:: <Script >( ) . unwrap( )
76
121
) ;
122
+ assert_eq ! (
123
+ serde_json:: from_reader:: <_, Script >( & br#""Latn""# [ ..] ) . unwrap( ) ,
124
+ "Latn" . parse:: <Script >( ) . unwrap( )
125
+ ) ;
77
126
assert ! ( serde_json:: from_str:: <Script >( r#""2Xs""# ) . is_err( ) ) ;
78
127
79
128
assert_eq ! (
@@ -84,23 +133,37 @@ fn json() {
84
133
serde_json:: from_str:: <Region >( r#""US""# ) . unwrap( ) ,
85
134
"US" . parse:: <Region >( ) . unwrap( )
86
135
) ;
136
+ assert_eq ! (
137
+ serde_json:: from_reader:: <_, Region >( & br#""US""# [ ..] ) . unwrap( ) ,
138
+ "US" . parse:: <Region >( ) . unwrap( )
139
+ ) ;
87
140
assert ! ( serde_json:: from_str:: <Region >( r#""2Xs""# ) . is_err( ) ) ;
88
141
}
89
142
90
143
#[ test]
91
144
fn postcard ( ) {
92
- use crate :: langid;
93
145
use crate :: subtags:: { Language , Region , Script } ;
146
+ use crate :: { langid, locale} ;
94
147
95
148
assert_eq ! (
96
149
postcard:: to_stdvec( & langid!( "en-US" ) ) . unwrap( ) ,
97
- & [ 5 , b'e' , b'n' , b'-' , b'U' , b'S' ]
150
+ b" \x05 en-US"
98
151
) ;
99
152
assert_eq ! (
100
- postcard:: from_bytes:: <LanguageIdentifier >( & [ 5 , b'e' , b'n' , b'-' , b'U' , b'S' ] ) . unwrap( ) ,
153
+ postcard:: from_bytes:: <LanguageIdentifier >( b" \x05 en-US" ) . unwrap( ) ,
101
154
langid!( "en-US" )
102
155
) ;
103
- assert ! ( postcard:: from_bytes:: <LanguageIdentifier >( & [ 3 , b'2' , b'X' , b's' ] ) . is_err( ) ) ;
156
+ assert ! ( postcard:: from_bytes:: <LanguageIdentifier >( b"\x03 2Xs" ) . is_err( ) ) ;
157
+
158
+ assert_eq ! (
159
+ postcard:: to_stdvec( & locale!( "en-US-u-hc-h12" ) ) . unwrap( ) ,
160
+ b"\x0E en-US-u-hc-h12"
161
+ ) ;
162
+ assert_eq ! (
163
+ postcard:: from_bytes:: <Locale >( b"\x0E en-US-u-hc-h12" ) . unwrap( ) ,
164
+ locale!( "en-US-u-hc-h12" )
165
+ ) ;
166
+ assert ! ( postcard:: from_bytes:: <Locale >( b"\x03 2Xs" ) . is_err( ) ) ;
104
167
105
168
assert_eq ! (
106
169
postcard:: to_stdvec( & "fr" . parse:: <Language >( ) . unwrap( ) ) . unwrap( ) ,
0 commit comments