@@ -20,27 +20,40 @@ enum Value {
20
20
Boolean ( bool ) ,
21
21
Number ( i32 ) ,
22
22
String ( String ) ,
23
+ Array ( Vec < Value > ) ,
23
24
Object ( Object ) ,
24
25
}
25
26
26
27
type Object = Vec < ( String , Value ) > ;
27
28
28
- /// Minimal "almost JSON" generator (e.g. no `null`s, no arrays, no escaping),
29
+ fn comma_sep < T > ( seq : & [ T ] , formatter : & mut Formatter < ' _ > , f : impl Fn ( & mut Formatter < ' _ > , & T ) -> Result ) -> Result {
30
+ if let [ ref rest @ .., ref last] = seq[ ..] {
31
+ for v in rest {
32
+ f ( formatter, v) ?;
33
+ formatter. write_str ( "," ) ?;
34
+ }
35
+ f ( formatter, last) ?;
36
+ }
37
+ Ok ( ( ) )
38
+ }
39
+
40
+ /// Minimal "almost JSON" generator (e.g. no `null`s, no escaping),
29
41
/// enough for this purpose.
30
42
impl Display for Value {
31
43
fn fmt ( & self , formatter : & mut Formatter < ' _ > ) -> Result {
32
44
match self {
33
45
Value :: Boolean ( boolean) => write ! ( formatter, "{}" , boolean) ,
34
46
Value :: Number ( number) => write ! ( formatter, "{}" , number) ,
35
47
Value :: String ( string) => write ! ( formatter, "\" {}\" " , string) ,
48
+ Value :: Array ( values) => {
49
+ formatter. write_str ( "[" ) ?;
50
+ comma_sep ( & values[ ..] , formatter, |formatter, v| v. fmt ( formatter) ) ?;
51
+ formatter. write_str ( "]" )
52
+ }
36
53
Value :: Object ( object) => {
37
54
formatter. write_str ( "{" ) ?;
38
- if let [ ref rest @ .., ref last] = object[ ..] {
39
- for ( key, value) in rest {
40
- write ! ( formatter, "\" {}\" : {}," , key, value) ?;
41
- }
42
- write ! ( formatter, "\" {}\" : {}" , last. 0 , last. 1 ) ?;
43
- }
55
+ comma_sep ( & object[ ..] , formatter, |formatter, v|
56
+ write ! ( formatter, "\" {}\" : {}" , v. 0 , v. 1 ) ) ?;
44
57
formatter. write_str ( "}" )
45
58
}
46
59
}
@@ -77,9 +90,9 @@ impl From<Object> for Value {
77
90
}
78
91
}
79
92
80
- impl Push < & str > for TargetSpec {
81
- fn push ( & mut self , key : & str , value : & str ) {
82
- self . push ( key , value . to_string ( ) ) ;
93
+ impl < T : Into < Value > , const N : usize > From < [ T ; N ] > for Value {
94
+ fn from ( i : [ T ; N ] ) -> Self {
95
+ Self :: Array ( i . into_iter ( ) . map ( |v| v . into ( ) ) . collect ( ) )
83
96
}
84
97
}
85
98
0 commit comments