pub mod types;
use syn::{Fields, GenericArgument, PathArguments, Type};
pub fn extract_option_inner_type(type_path: &syn::TypePath) -> Option<&Type> {
let seg = type_path.path.segments.last()?;
if seg.ident != "Option" {
return None;
}
let PathArguments::AngleBracketed(args) = &seg.arguments else { return None };
let GenericArgument::Type(inner_ty) = args.args.first()? else { return None };
Some(inner_ty)
}
pub fn is_option_type(type_path: &syn::TypePath) -> bool {
type_path
.path
.segments
.last()
.map(|seg| seg.ident == "Option")
.unwrap_or(false)
}
pub fn extract_type_name(ty: &Type) -> String {
match ty {
Type::Path(type_path) => type_path
.path
.segments
.last()
.map(|seg| seg.ident.to_string())
.unwrap_or_else(|| "unknown".to_string()),
_ => "unknown".to_string(),
}
}
pub fn detect_wrapper_enum(data: &syn::DataEnum) -> bool {
if data.variants.is_empty() {
return false;
}
data.variants.iter().all(
|variant| matches!(&variant.fields, Fields::Unnamed(fields) if fields.unnamed.len() == 1),
)
}