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,45 @@ 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 ( || ( data. clone ( ) , Vec :: with_capacity ( 3 ) ) )
59+ . 1
60+ . push ( trait_name) ;
4661 }
4762 }
4863 dest_file
49- . write_all ( b"_=>\" \" }}" )
64+ . write_all ( b"_=>\" \" }} pub mod icons { use super::{IconStr, Regular, Brands, Solid}; " )
5065 . 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" ) ;
5191}
0 commit comments