@@ -20,8 +20,17 @@ pub struct Crate {
20
20
pub ( crate ) root_module : PathBuf ,
21
21
pub ( crate ) edition : Edition ,
22
22
pub ( crate ) deps : Vec < Dep > ,
23
+
24
+ // This is the preferred method of providing cfg options.
25
+ #[ serde( default ) ]
26
+ pub ( crate ) cfg : FxHashSet < String > ,
27
+
28
+ // These two are here for transition only.
29
+ #[ serde( default ) ]
23
30
pub ( crate ) atom_cfgs : FxHashSet < String > ,
31
+ #[ serde( default ) ]
24
32
pub ( crate ) key_value_cfgs : FxHashMap < String , String > ,
33
+
25
34
pub ( crate ) out_dir : Option < PathBuf > ,
26
35
pub ( crate ) proc_macro_dylib_path : Option < PathBuf > ,
27
36
}
@@ -54,3 +63,73 @@ pub struct JsonProject {
54
63
pub ( crate ) roots : Vec < Root > ,
55
64
pub ( crate ) crates : Vec < Crate > ,
56
65
}
66
+
67
+ #[ cfg( test) ]
68
+ mod tests {
69
+ use super :: * ;
70
+ use serde_json:: json;
71
+
72
+ #[ test]
73
+ fn test_crate_deserialization ( ) {
74
+ let raw_json = json ! ( {
75
+ "crate_id" : 2 ,
76
+ "root_module" : "this/is/a/file/path.rs" ,
77
+ "deps" : [
78
+ {
79
+ "crate" : 1 ,
80
+ "name" : "some_dep_crate"
81
+ } ,
82
+ ] ,
83
+ "edition" : "2015" ,
84
+ "cfg" : [
85
+ "atom_1" ,
86
+ "atom_2" ,
87
+ "feature=feature_1" ,
88
+ "feature=feature_2" ,
89
+ "other=value" ,
90
+ ] ,
91
+
92
+ } ) ;
93
+
94
+ let krate: Crate = serde_json:: from_value ( raw_json) . unwrap ( ) ;
95
+
96
+ assert ! ( krate. cfg. contains( & "atom_1" . to_string( ) ) ) ;
97
+ assert ! ( krate. cfg. contains( & "atom_2" . to_string( ) ) ) ;
98
+ assert ! ( krate. cfg. contains( & "feature=feature_1" . to_string( ) ) ) ;
99
+ assert ! ( krate. cfg. contains( & "feature=feature_2" . to_string( ) ) ) ;
100
+ assert ! ( krate. cfg. contains( & "other=value" . to_string( ) ) ) ;
101
+ }
102
+
103
+ #[ test]
104
+ fn test_crate_deserialization_old_json ( ) {
105
+ let raw_json = json ! ( {
106
+ "crate_id" : 2 ,
107
+ "root_module" : "this/is/a/file/path.rs" ,
108
+ "deps" : [
109
+ {
110
+ "crate" : 1 ,
111
+ "name" : "some_dep_crate"
112
+ } ,
113
+ ] ,
114
+ "edition" : "2015" ,
115
+ "atom_cfgs" : [
116
+ "atom_1" ,
117
+ "atom_2" ,
118
+ ] ,
119
+ "key_value_cfgs" : {
120
+ "feature" : "feature_1" ,
121
+ "feature" : "feature_2" ,
122
+ "other" : "value" ,
123
+ } ,
124
+ } ) ;
125
+
126
+ let krate: Crate = serde_json:: from_value ( raw_json) . unwrap ( ) ;
127
+
128
+ assert ! ( krate. atom_cfgs. contains( & "atom_1" . to_string( ) ) ) ;
129
+ assert ! ( krate. atom_cfgs. contains( & "atom_2" . to_string( ) ) ) ;
130
+ assert ! ( krate. key_value_cfgs. contains_key( & "feature" . to_string( ) ) ) ;
131
+ assert_eq ! ( krate. key_value_cfgs. get( "feature" ) , Some ( & "feature_2" . to_string( ) ) ) ;
132
+ assert ! ( krate. key_value_cfgs. contains_key( & "other" . to_string( ) ) ) ;
133
+ assert_eq ! ( krate. key_value_cfgs. get( "other" ) , Some ( & "value" . to_string( ) ) ) ;
134
+ }
135
+ }
0 commit comments