Skip to main content

farben_macros/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{LitStr, parse_macro_input};
4
5#[proc_macro]
6pub fn color(input: TokenStream) -> TokenStream {
7    let input = parse_macro_input!(input as LitStr);
8    let value = input.value();
9
10    let tokens = match farben_core::lexer::tokenize(&value) {
11        Ok(t) => t,
12        Err(e) => {
13            let msg = e.to_string();
14            return syn::Error::new_spanned(&input, msg)
15                .to_compile_error()
16                .into();
17        }
18    };
19
20    let result = farben_core::parser::render(tokens);
21    quote! { #result }.into()
22}
23
24#[proc_macro]
25pub fn validate_color(input: TokenStream) -> TokenStream {
26    let input = parse_macro_input!(input as LitStr);
27    let value = input.value();
28
29    match farben_core::lexer::tokenize(&value) {
30        Ok(_) => quote! { #input }.into(),
31        Err(e) => {
32            let msg = e.to_string();
33            syn::Error::new_spanned(&input, msg)
34                .to_compile_error()
35                .into()
36        }
37    }
38}