glyphr_macros/
lib.rs

1mod config;
2mod generator;
3mod macro_parser;
4mod renderer;
5
6#[cfg(feature = "toml")]
7mod toml_parser;
8
9use proc_macro::TokenStream;
10use syn::parse_macro_input;
11
12use macro_parser::FontConfig;
13
14/// Macro used to generate a font with data direcly in the code
15#[proc_macro]
16pub fn generate_font(input: TokenStream) -> TokenStream {
17    let font_input: FontConfig = parse_macro_input!(input as FontConfig);
18
19    let rendered = renderer::render(font_input);
20
21    match rendered.parse() {
22        Ok(parsed) => parsed,
23        Err(e) => {
24            panic!("Failed to generate font: {e}")
25        }
26    }
27}
28
29/// The underlying process is the same as `generate_font!` macro, but can do more at the same time by
30/// specifing fonts in a `toml` file as specified in `README.md`
31#[cfg(feature = "toml")]
32#[proc_macro]
33pub fn generate_fonts_from_toml(input: TokenStream) -> TokenStream {
34    use std::fs;
35    use syn::LitStr;
36    use toml;
37
38    let file_path = parse_macro_input!(input as LitStr);
39    let path_str = file_path.value();
40    let content = match fs::read_to_string(&path_str) {
41        Ok(content) => content,
42        Err(err) => {
43            return syn::Error::new_spanned(
44                file_path,
45                format!("Failed to read file '{path_str}': {err}"),
46            )
47            .to_compile_error()
48            .into();
49        }
50    };
51    let mut toml_input: toml_parser::TomlConfig =
52        toml::from_str(&content).expect("Could not parse toml file");
53    toml_input.relativize_paths(&path_str);
54
55    let rendered = renderer::render(toml_input);
56
57    match rendered.parse() {
58        Ok(parsed) => parsed,
59        Err(e) => {
60            panic!("Failed to generate font: {e}")
61        }
62    }
63}