ct_regex_internal/codegen/create_type/
literal.rs1#![allow(non_snake_case)]
2
3use proc_macro2::{Literal, TokenStream};
4use quote::quote;
5use syn::Ident;
6
7use crate::codegen::{self, CodegenItem, ExprMetadata};
8
9pub(crate) fn impl_literals<I: CodegenItem>(metadata: ExprMetadata<I>) -> TokenStream {
10 metadata.literals.into_iter()
11 .enumerate()
12 .map(|(index, literal)| impl_literal(&metadata.name, index, literal))
13 .collect()
14}
15
16pub(crate) fn impl_literal(name: &Ident, index: usize, literal: Box<[u8]>) -> TokenStream {
17 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);
18
19 let name = codegen::create_literal_id(name, index);
20 let literal = Literal::byte_string(&literal);
21
22 {
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! {
23 #[derive(Default, Clone, Copy)]
24 pub struct #name;
25
26 impl #LiteralTrait for #name {
27 const LITERAL: &[u8] = #literal;
28 }
29 }
30}