ct_regex_internal/codegen/create_type/
literal.rs1use proc_macro2::{Literal, TokenStream};
2use quote::quote;
3use syn::Ident;
4
5use crate::codegen::{self, ExprMetadata};
6
7pub(crate) fn impl_literals(metadata: ExprMetadata) -> TokenStream {
8 metadata.literals.into_iter()
9 .enumerate()
10 .map(|(index, literal)| impl_literal(&metadata.name, index, literal))
11 .collect()
12}
13
14pub(crate) fn impl_literal(name: &Ident, index: usize, literal: Box<[u8]>) -> TokenStream {
15 #![allow(nonstandard_style)]
16 let LiteralTrait = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Literal");
_s
}quote!(::ct_regex::internal::matcher::Literal);
17
18 let name = codegen::create_literal_id(name, index);
19 let literal = Literal::byte_string(&literal);
20
21 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "derive");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "Default");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Clone");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Copy");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "struct");
::quote::ToTokens::to_tokens(&name, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&LiteralTrait, &mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&name, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "const");
::quote::__private::push_ident(&mut _s, "LITERAL");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "u8");
_s
});
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&literal, &mut _s);
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
22 #[derive(Default, Clone, Copy)]
23 pub struct #name;
24
25 impl #LiteralTrait for #name {
26 const LITERAL: &[u8] = #literal;
27 }
28 }
29}