font_map_macros/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use font_map_core::{font::Font, FontCodegenExt};
use proc_macro::TokenStream;
use syn::{parse::Parse, parse_macro_input, Ident, LitStr};

struct FontParameters {
    identifier: Ident,
    path: LitStr,
}
impl Parse for FontParameters {
    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
        let identifier = input.parse()?;
        input.parse::<syn::Token![,]>()?;
        let path = input.parse()?;

        Ok(Self { identifier, path })
    }
}

#[proc_macro]
pub fn font(input: TokenStream) -> TokenStream {
    //
    // Parse input as an ident, then a string literal - like:
    // font!(Icon, "path/to/font.ttf");
    let input = parse_macro_input!(input as FontParameters);

    let identifier = input.identifier.to_string();
    let path = input.path.value();

    let font_bytes =
        std::fs::read(&path).unwrap_or_else(|_| panic!("Failed to read font at `{path}`"));
    let font = Font::new(&font_bytes).unwrap_or_else(|_| panic!("Invalid font file: `{path}`"));

    font.gen_enum(&identifier).into()
}