@@ -4,10 +4,12 @@ use quote::quote;
4
4
use serde:: { Deserialize , Serialize } ;
5
5
use std:: {
6
6
collections:: { BTreeMap , HashMap } ,
7
- env , fs, io,
7
+ fs, io,
8
8
path:: Path ,
9
9
} ;
10
10
11
+ const OUT_DIR : & str = "src/generated" ;
12
+
11
13
fn encode_browser_name ( name : & str ) -> u8 {
12
14
match name {
13
15
"ie" => 1 ,
@@ -58,7 +60,6 @@ struct Feature {
58
60
}
59
61
60
62
fn main ( ) -> Result < ( ) > {
61
- generate_browser_names_cache ( ) ?;
62
63
build_electron_to_chromium ( ) ?;
63
64
build_node_versions ( ) ?;
64
65
build_node_release_schedule ( ) ?;
@@ -68,30 +69,12 @@ fn main() -> Result<()> {
68
69
Ok ( ( ) )
69
70
}
70
71
71
- fn generate_browser_names_cache ( ) -> Result < ( ) > {
72
- string_cache_codegen:: AtomType :: new (
73
- "data::browser_name::BrowserNameAtom" ,
74
- "browser_name_atom!" ,
75
- )
76
- . atoms ( & [
77
- "ie" , "edge" , "firefox" , "chrome" , "safari" , "opera" , "ios_saf" , "op_mini" , "android" ,
78
- "bb" , "op_mob" , "and_chr" , "and_ff" , "ie_mob" , "and_uc" , "samsung" , "and_qq" , "baidu" ,
79
- "kaios" ,
80
- ] )
81
- . write_to_file ( & Path :: new ( & env:: var ( "OUT_DIR" ) ?) . join ( "browser_name_atom.rs" ) ) ?;
82
-
83
- Ok ( ( ) )
84
- }
85
-
86
72
fn build_electron_to_chromium ( ) -> Result < ( ) > {
87
- println ! ( "cargo:rerun-if-changed=vendor/electron-to-chromium/versions.json" ) ;
88
-
89
- let path = format ! ( "{}/electron-to-chromium.rs" , env:: var( "OUT_DIR" ) ?) ;
73
+ let path = format ! ( "{OUT_DIR}/electron-to-chromium.rs" ) ;
90
74
91
- let mut data = serde_json:: from_slice :: < BTreeMap < String , String > > ( & fs:: read ( format ! (
92
- "{}/vendor/electron-to-chromium/versions.json" ,
93
- env:: var( "CARGO_MANIFEST_DIR" ) ?
94
- ) ) ?) ?
75
+ let mut data = serde_json:: from_slice :: < BTreeMap < String , String > > ( & fs:: read (
76
+ "vendor/electron-to-chromium/versions.json" ,
77
+ ) ?) ?
95
78
. into_iter ( )
96
79
. map ( |( electron_version, chromium_version) | {
97
80
( electron_version. parse :: < f32 > ( ) . unwrap ( ) , chromium_version)
@@ -123,14 +106,10 @@ fn build_node_versions() -> Result<()> {
123
106
version : String ,
124
107
}
125
108
126
- println ! ( "cargo:rerun-if-changed=vendor/node-releases/data/processed/envs.json" ) ;
127
-
128
- let path = format ! ( "{}/node-versions.rs" , env:: var( "OUT_DIR" ) ?) ;
109
+ let path = format ! ( "{OUT_DIR}/node-versions.rs" ) ;
129
110
130
- let releases: Vec < NodeRelease > = serde_json:: from_slice ( & fs:: read ( format ! (
131
- "{}/vendor/node-releases/data/processed/envs.json" ,
132
- env:: var( "CARGO_MANIFEST_DIR" ) ?
133
- ) ) ?) ?;
111
+ let releases: Vec < NodeRelease > =
112
+ serde_json:: from_slice ( & fs:: read ( "vendor/node-releases/data/processed/envs.json" ) ?) ?;
134
113
135
114
let versions = releases. into_iter ( ) . map ( |release| release. version ) ;
136
115
fs:: write (
@@ -145,22 +124,17 @@ fn build_node_versions() -> Result<()> {
145
124
}
146
125
147
126
fn build_node_release_schedule ( ) -> Result < ( ) > {
148
- println ! (
149
- "cargo:rerun-if-changed=vendor/node-releases/data/release-schedule/release-schedule.json"
150
- ) ;
151
-
152
127
#[ derive( Deserialize ) ]
153
128
struct NodeRelease {
154
129
start : String ,
155
130
end : String ,
156
131
}
157
132
158
- let path = format ! ( "{}/node-release-schedule.rs" , env :: var ( "OUT_DIR" ) ? ) ;
133
+ let path = format ! ( "{OUT_DIR }/node-release-schedule.rs" ) ;
159
134
160
- let schedule: HashMap < String , NodeRelease > = serde_json:: from_slice ( & fs:: read ( format ! (
161
- "{}/vendor/node-releases/data/release-schedule/release-schedule.json" ,
162
- env:: var( "CARGO_MANIFEST_DIR" ) ?
163
- ) ) ?) ?;
135
+ let schedule: HashMap < String , NodeRelease > = serde_json:: from_slice ( & fs:: read (
136
+ "vendor/node-releases/data/release-schedule/release-schedule.json" ,
137
+ ) ?) ?;
164
138
let cap = schedule. len ( ) ;
165
139
let versions = schedule
166
140
. into_iter ( )
@@ -185,12 +159,10 @@ fn build_node_release_schedule() -> Result<()> {
185
159
}
186
160
187
161
fn build_caniuse_global ( ) -> Result < ( ) > {
188
- let out_dir = env:: var ( "OUT_DIR" ) ?;
189
-
190
162
let data = parse_caniuse_global ( ) ?;
191
163
192
164
fs:: write (
193
- format ! ( "{}/caniuse-browsers.rs" , & out_dir ) ,
165
+ format ! ( "{OUT_DIR }/caniuse-browsers.rs" ) ,
194
166
{
195
167
let map_cap = data. agents . len ( ) ;
196
168
let browser_stat = data. agents . iter ( ) . map ( |( name, agent) | {
@@ -211,14 +183,13 @@ fn build_caniuse_global() -> Result<()> {
211
183
}
212
184
} ) ;
213
185
quote ! {
214
- map. insert( BrowserNameAtom :: from ( #name) , BrowserStat {
215
- name: BrowserNameAtom :: from ( #name) ,
186
+ map. insert( #name, BrowserStat {
187
+ name: #name,
216
188
version_list: vec![ #( #detail) , * ] ,
217
189
} ) ;
218
190
}
219
191
} ) ;
220
192
quote ! { {
221
- use ahash:: AHashMap ;
222
193
let mut map = AHashMap :: with_capacity( #map_cap) ;
223
194
#( #browser_stat) *
224
195
map
@@ -235,7 +206,7 @@ fn build_caniuse_global() -> Result<()> {
235
206
(
236
207
usage,
237
208
quote ! {
238
- ( BrowserNameAtom :: from ( #name) , #version, #usage)
209
+ ( #name, #version, #usage)
239
210
} ,
240
211
)
241
212
} )
@@ -244,20 +215,20 @@ fn build_caniuse_global() -> Result<()> {
244
215
global_usage. sort_unstable_by ( |( a, _) , ( b, _) | b. partial_cmp ( a) . unwrap ( ) ) ;
245
216
let push_usage = global_usage. into_iter ( ) . map ( |( _, tokens) | tokens) ;
246
217
fs:: write (
247
- format ! ( "{}/caniuse-global-usage.rs" , & out_dir ) ,
218
+ format ! ( "{OUT_DIR }/caniuse-global-usage.rs" ) ,
248
219
quote ! {
249
220
vec![ #( #push_usage) , * ]
250
221
}
251
222
. to_string ( ) ,
252
223
) ?;
253
224
254
- let features_dir = format ! ( "{}/features" , & out_dir ) ;
225
+ let features_dir = format ! ( "{OUT_DIR }/features" ) ;
255
226
if matches ! ( fs:: File :: open( & features_dir) , Err ( e) if e. kind( ) == io:: ErrorKind :: NotFound ) {
256
227
fs:: create_dir ( & features_dir) ?;
257
228
}
258
229
for ( name, feature) in & data. data {
259
230
fs:: write (
260
- format ! ( "{}/{}.json" , & features_dir , name ) ,
231
+ format ! ( "{features_dir }/{name }.json" ) ,
261
232
serde_json:: to_string (
262
233
& feature
263
234
. stats
@@ -290,15 +261,18 @@ fn build_caniuse_global() -> Result<()> {
290
261
use indexmap:: IndexMap ;
291
262
use once_cell:: sync:: Lazy ;
292
263
use serde_json:: from_str;
293
- use crate :: data:: browser_name:: BrowserNameAtom ;
264
+ use crate :: data:: decode_browser_name;
265
+
266
+ type Stat = Lazy <AHashMap <& ' static str , IndexMap <& ' static str , u8 >>>;
267
+ type Json = AHashMap :: <u8 , IndexMap <& ' static str , u8 >>;
294
268
295
269
match name {
296
270
#( #features => {
297
- static STAT : Lazy < AHashMap < BrowserNameAtom , IndexMap < & ' static str , u8 >>> = Lazy :: new( || {
298
- from_str:: <AHashMap :: < u8 , IndexMap < & ' static str , u8 >>> ( include_str!( concat!( env! ( "OUT_DIR" ) , "/ features/", #features, ".json" ) ) )
271
+ static STAT : Stat = Lazy :: new( || {
272
+ from_str:: <Json > ( include_str!( concat!( " features/", #features, ".json" ) ) )
299
273
. unwrap( )
300
274
. into_iter( )
301
- . map( |( browser, versions) | ( crate :: data :: browser_name :: decode_browser_name( browser) , versions) )
275
+ . map( |( browser, versions) | ( decode_browser_name( browser) , versions) )
302
276
. collect( )
303
277
} ) ;
304
278
Some ( & * STAT )
@@ -307,20 +281,17 @@ fn build_caniuse_global() -> Result<()> {
307
281
}
308
282
} } ;
309
283
fs:: write (
310
- format ! ( "{}/caniuse-feature-matching.rs" , & out_dir ) ,
284
+ format ! ( "{OUT_DIR }/caniuse-feature-matching.rs" ) ,
311
285
tokens. to_string ( ) ,
312
286
) ?;
313
287
314
288
Ok ( ( ) )
315
289
}
316
290
317
291
fn parse_caniuse_global ( ) -> Result < Caniuse > {
318
- println ! ( "cargo:rerun-if-changed=vendor/caniuse/fulldata-json/data-2.0.json" ) ;
319
-
320
- Ok ( serde_json:: from_slice ( & fs:: read ( format ! (
321
- "{}/vendor/caniuse/fulldata-json/data-2.0.json" ,
322
- env:: var( "CARGO_MANIFEST_DIR" ) ?
323
- ) ) ?) ?)
292
+ Ok ( serde_json:: from_slice ( & fs:: read (
293
+ "vendor/caniuse/fulldata-json/data-2.0.json" ,
294
+ ) ?) ?)
324
295
}
325
296
326
297
fn build_caniuse_region ( ) -> Result < ( ) > {
@@ -329,25 +300,13 @@ fn build_caniuse_region() -> Result<()> {
329
300
data : HashMap < String , HashMap < String , Option < f32 > > > ,
330
301
}
331
302
332
- let files = fs:: read_dir ( format ! (
333
- "{}/vendor/caniuse/region-usage-json" ,
334
- env:: var( "CARGO_MANIFEST_DIR" ) ?
335
- ) ) ?
336
- . map ( |entry| entry. map_err ( anyhow:: Error :: from) )
337
- . collect :: < Result < Vec < _ > > > ( ) ?;
338
-
339
- files. iter ( ) . for_each ( |entry| {
340
- println ! (
341
- "cargo:rerun-if-changed=vendor/caniuse/region-usage-json/{}" ,
342
- entry. file_name( ) . into_string( ) . unwrap( )
343
- )
344
- } ) ;
345
-
346
- let out_dir = env:: var ( "OUT_DIR" ) ?;
303
+ let files = fs:: read_dir ( "vendor/caniuse/region-usage-json" ) ?
304
+ . map ( |entry| entry. map_err ( anyhow:: Error :: from) )
305
+ . collect :: < Result < Vec < _ > > > ( ) ?;
347
306
348
307
let Caniuse { agents, .. } = parse_caniuse_global ( ) ?;
349
308
350
- let region_dir = format ! ( "{}/region" , & out_dir ) ;
309
+ let region_dir = format ! ( "{OUT_DIR }/region" ) ;
351
310
if matches ! ( fs:: File :: open( & region_dir) , Err ( e) if e. kind( ) == io:: ErrorKind :: NotFound ) {
352
311
fs:: create_dir ( & region_dir) ?;
353
312
}
@@ -370,7 +329,7 @@ fn build_caniuse_region() -> Result<()> {
370
329
. collect :: < Vec < _ > > ( ) ;
371
330
usage. sort_unstable_by ( |( _, _, a) , ( _, _, b) | b. partial_cmp ( a) . unwrap ( ) ) ;
372
331
fs:: write (
373
- format ! ( "{}/region/{}" , & out_dir , file. file_name( ) . to_str( ) . unwrap( ) ) ,
332
+ format ! ( "{OUT_DIR }/region/{}" , file. file_name( ) . to_str( ) . unwrap( ) ) ,
374
333
serde_json:: to_string ( & usage) ?,
375
334
) ?;
376
335
}
@@ -389,15 +348,18 @@ fn build_caniuse_region() -> Result<()> {
389
348
let tokens = quote ! { {
390
349
use once_cell:: sync:: Lazy ;
391
350
use serde_json:: from_str;
392
- use crate :: data:: browser_name:: BrowserNameAtom ;
351
+ use crate :: data:: decode_browser_name;
352
+
353
+ type Usage = Lazy <Vec <( & ' static str , & ' static str , f32 ) >>;
354
+ type Json = Vec <( u8 , & ' static str , f32 ) >;
393
355
394
356
match region {
395
357
#( #regions => {
396
- static USAGE : Lazy < Vec < ( BrowserNameAtom , & ' static str , f32 ) >> = Lazy :: new( || {
397
- from_str:: <Vec < ( u8 , & ' static str , f32 ) >> ( include_str!( concat!( env! ( "OUT_DIR" ) , "/ region/", #regions, ".json" ) ) )
358
+ static USAGE : Usage = Lazy :: new( || {
359
+ from_str:: <Json > ( include_str!( concat!( " region/", #regions, ".json" ) ) )
398
360
. unwrap( )
399
361
. into_iter( )
400
- . map( |( browser, version, usage) | ( crate :: data :: browser_name :: decode_browser_name( browser) , version, usage) )
362
+ . map( |( browser, version, usage) | ( decode_browser_name( browser) , version, usage) )
401
363
. collect( )
402
364
} ) ;
403
365
Some ( & * USAGE )
@@ -406,7 +368,7 @@ fn build_caniuse_region() -> Result<()> {
406
368
}
407
369
} } ;
408
370
fs:: write (
409
- format ! ( "{}/caniuse-region-matching.rs" , & out_dir ) ,
371
+ format ! ( "{OUT_DIR }/caniuse-region-matching.rs" ) ,
410
372
tokens. to_string ( ) ,
411
373
) ?;
412
374
0 commit comments