use syn::{Token, parse::Parse};
use crate::parse::next_node_id;
#[cfg(feature = "regex")]
#[derive(Debug, Clone)]
pub(crate) struct PatternRegex {
pub node_id: usize,
pub pattern: String,
pub span: proc_macro2::Span,
}
#[cfg(feature = "regex")]
#[derive(Debug, Clone)]
pub(crate) struct PatternLike {
pub node_id: usize,
pub expr: syn::Expr,
}
#[cfg(feature = "regex")]
impl PatternLike {
pub(crate) fn into_pattern(self) -> crate::pattern::Pattern {
if let syn::Expr::Lit(syn::ExprLit {
lit: syn::Lit::Str(lit_str),
..
}) = &self.expr
{
crate::pattern::Pattern::Regex(PatternRegex {
node_id: self.node_id,
pattern: lit_str.value(),
span: lit_str.span(),
})
} else {
crate::pattern::Pattern::Like(self)
}
}
}
#[cfg(feature = "regex")]
impl Parse for PatternLike {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let _: Token![=] = input.parse()?;
let _: Token![~] = input.parse()?;
let expr = input.parse::<syn::Expr>()?;
Ok(PatternLike {
node_id: next_node_id(),
expr,
})
}
}