1
1
use std:: {
2
+ collections:: HashMap ,
2
3
env,
4
+ fmt:: Write as FmtWrite ,
3
5
fs:: { read_dir, File } ,
4
6
io:: { Read , Write } ,
5
7
path:: Path ,
@@ -11,13 +13,26 @@ fn main() {
11
13
write_fontawesome_sprite ( ) ;
12
14
}
13
15
16
+ fn capitalize_first_letter ( s : & str ) -> String {
17
+ let mut c = s. chars ( ) ;
18
+ match c. next ( ) {
19
+ None => String :: new ( ) ,
20
+ Some ( f) => f. to_uppercase ( ) . chain ( c) . collect ( ) ,
21
+ }
22
+ }
23
+
14
24
fn write_fontawesome_sprite ( ) {
25
+ let mut types = HashMap :: new ( ) ;
15
26
let dest_path = Path :: new ( & env:: var ( "OUT_DIR" ) . unwrap ( ) ) . join ( "fontawesome.rs" ) ;
16
27
let mut dest_file = File :: create ( dest_path) . unwrap ( ) ;
17
28
dest_file
18
29
. write_all ( b"const fn fontawesome_svg(dir:&str,file:&str)->&'static str{match(dir.as_bytes(),file.as_bytes()){" )
19
30
. expect ( "fontawesome fn write" ) ;
20
- for dirname in & [ "brands" , "regular" , "solid" ] {
31
+ for ( dirname, trait_name) in & [
32
+ ( "brands" , "Brands" ) ,
33
+ ( "regular" , "Regular" ) ,
34
+ ( "solid" , "Solid" ) ,
35
+ ] {
21
36
let dir = read_dir ( Path :: new ( "fontawesome-free-6.2.0-desktop/svgs" ) . join ( dirname) ) . unwrap ( ) ;
22
37
let mut data = String :: new ( ) ;
23
38
for file in dir {
@@ -32,20 +47,45 @@ fn write_fontawesome_sprite() {
32
47
. expect ( "fontawesome file read" ) ;
33
48
// if this assert goes off, add more hashes here and in the format! below
34
49
assert ! ( !data. contains( "###" ) , "file {filename} breaks raw string" ) ;
50
+ let filename = filename. replace ( ".svg" , "" ) ;
35
51
dest_file
36
52
. write_all (
37
- format ! (
38
- r####"(b"{dirname}",b"{filename}")=>r#"{data}"#,"#### ,
39
- data = data,
40
- dirname = dirname,
41
- filename = filename. replace( ".svg" , "" ) ,
42
- )
43
- . as_bytes ( ) ,
53
+ format ! ( r####"(b"{dirname}",b"{filename}")=>r#"{data}"#,"#### ) . as_bytes ( ) ,
44
54
)
45
55
. expect ( "write fontawesome file" ) ;
56
+ types
57
+ . entry ( filename)
58
+ . or_insert_with ( || ( data. clone ( ) , Vec :: with_capacity ( 3 ) ) )
59
+ . 1
60
+ . push ( trait_name) ;
46
61
}
47
62
}
48
63
dest_file
49
- . write_all ( b"_=>\" \" }}" )
64
+ . write_all ( b"_=>\" \" }} pub mod icons { use super::{IconStr, Regular, Brands, Solid}; " )
50
65
. expect ( "fontawesome fn write" ) ;
66
+
67
+ for ( icon, ( data, kinds) ) in types {
68
+ let mut type_name = "Icon" . to_string ( ) ;
69
+ type_name. extend ( icon. split ( '-' ) . map ( capitalize_first_letter) ) ;
70
+ let kinds = kinds. iter ( ) . fold ( String :: new ( ) , |mut acc, k| {
71
+ let _ = writeln ! ( acc, "impl {k} for {type_name} {{}}" ) ;
72
+ acc
73
+ } ) ;
74
+ dest_file
75
+ . write_all (
76
+ format ! (
77
+ "\n #[derive(Debug, Clone, Copy, PartialEq, Eq)]
78
+ pub struct {type_name};
79
+ impl IconStr for {type_name} {{
80
+ fn icon_name(&self) -> &'static str {{ r#\" {icon}\" # }}
81
+ fn icon_str(&self) -> &'static str {{ r#\" {data}\" # }}
82
+ }}
83
+ {kinds}"
84
+ )
85
+ . as_bytes ( ) ,
86
+ )
87
+ . expect ( "write fontawesome file types" ) ;
88
+ }
89
+
90
+ dest_file. write_all ( b"}" ) . expect ( "fontawesome fn write" ) ;
51
91
}
0 commit comments