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#[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#[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}