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}