1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{LitStr, parse_macro_input};
4
5#[proc_macro]
18pub fn color(input: TokenStream) -> TokenStream {
19 let input = parse_macro_input!(input as LitStr);
20 let value = input.value();
21 let tokens = match farben_core::lexer::tokenize(&value) {
22 Ok(t) => t,
23 Err(e) => {
24 let msg = e.to_string();
25 return syn::Error::new_spanned(&input, msg)
26 .to_compile_error()
27 .into();
28 }
29 };
30 let result = format!("{}\x1b[0m", farben_core::parser::render(tokens));
31 quote! { #result }.into()
32}
33
34#[proc_macro]
36pub fn colorb(input: TokenStream) -> TokenStream {
37 let input = parse_macro_input!(input as LitStr);
38 let value = input.value();
39 let tokens = match farben_core::lexer::tokenize(&value) {
40 Ok(t) => t,
41 Err(e) => {
42 let msg = e.to_string();
43 return syn::Error::new_spanned(&input, msg)
44 .to_compile_error()
45 .into();
46 }
47 };
48 let result = farben_core::parser::render(tokens);
49 quote! { #result }.into()
50}
51
52#[proc_macro]
66pub fn validate_color(input: TokenStream) -> TokenStream {
67 let input = parse_macro_input!(input as LitStr);
68 let value = input.value();
69
70 match farben_core::lexer::tokenize(&value) {
71 Ok(_) => quote! { #input }.into(),
72 Err(e) => {
73 let msg = e.to_string();
74 syn::Error::new_spanned(&input, msg)
75 .to_compile_error()
76 .into()
77 }
78 }
79}