11use std:: {
2+ collections:: HashMap ,
23 env,
4+ fmt:: Write as FmtWrite ,
35 fs:: { read_dir, File } ,
46 io:: { Read , Write } ,
57 path:: Path ,
@@ -11,13 +13,26 @@ fn main() {
1113 write_fontawesome_sprite ( ) ;
1214}
1315
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+
1424fn write_fontawesome_sprite ( ) {
25+ let mut types = HashMap :: new ( ) ;
1526 let dest_path = Path :: new ( & env:: var ( "OUT_DIR" ) . unwrap ( ) ) . join ( "fontawesome.rs" ) ;
1627 let mut dest_file = File :: create ( dest_path) . unwrap ( ) ;
1728 dest_file
1829 . write_all ( b"const fn fontawesome_svg(dir:&str,file:&str)->&'static str{match(dir.as_bytes(),file.as_bytes()){" )
1930 . 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+ ] {
2136 let dir = read_dir ( Path :: new ( "fontawesome-free-6.2.0-desktop/svgs" ) . join ( dirname) ) . unwrap ( ) ;
2237 let mut data = String :: new ( ) ;
2338 for file in dir {
@@ -32,20 +47,43 @@ fn write_fontawesome_sprite() {
3247 . expect ( "fontawesome file read" ) ;
3348 // if this assert goes off, add more hashes here and in the format! below
3449 assert ! ( !data. contains( "###" ) , "file {filename} breaks raw string" ) ;
50+ let filename = filename. replace ( ".svg" , "" ) ;
3551 dest_file
3652 . 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 ( ) ,
4454 )
4555 . expect ( "write fontawesome file" ) ;
56+ types
57+ . entry ( filename)
58+ . or_insert_with ( || Vec :: with_capacity ( 3 ) )
59+ . push ( trait_name) ;
4660 }
4761 }
4862 dest_file
49- . write_all ( b"_=>\" \" }}" )
63+ . write_all ( b"_=>\" \" }} pub mod icons { use super::{IconStr, Regular, Brands, Solid}; " )
5064 . expect ( "fontawesome fn write" ) ;
65+
66+ for ( icon, kinds) in types {
67+ let mut type_name = "Icon" . to_string ( ) ;
68+ type_name. extend ( icon. split ( '-' ) . map ( capitalize_first_letter) ) ;
69+ let kinds = kinds. iter ( ) . fold ( String :: new ( ) , |mut acc, k| {
70+ let _ = write ! ( acc, "impl {k} for {type_name} {{}}\n " ) ;
71+ acc
72+ } ) ;
73+ dest_file
74+ . write_all (
75+ format ! (
76+ "\n #[derive(Debug, Clone, Copy, PartialEq, Eq)]
77+ pub struct {type_name};
78+ impl IconStr for {type_name} {{
79+ fn icon_str(&self) -> &'static str {{ r#\" {icon}\" # }}
80+ }}
81+ {kinds}"
82+ )
83+ . as_bytes ( ) ,
84+ )
85+ . expect ( "write fontawesome file types" ) ;
86+ }
87+
88+ dest_file. write_all ( b"}" ) . expect ( "fontawesome fn write" ) ;
5189}
0 commit comments