use proc_macro2::TokenStream;
use quote::{ToTokens, quote};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OuterAttr {
SkipSerializingNone,
SerdeAs,
}
impl ToTokens for OuterAttr {
fn to_tokens(&self, tokens: &mut TokenStream) {
let attr = match self {
OuterAttr::SkipSerializingNone => quote! { #[serde_with::skip_serializing_none] },
OuterAttr::SerdeAs => quote! { #[serde_with::serde_as] },
};
tokens.extend(attr);
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SerdeAsSeparator {
Comma,
Space,
Pipe,
}
impl SerdeAsSeparator {
fn type_path(self) -> &'static str {
match self {
SerdeAsSeparator::Comma => "oas3_gen_support::StringWithCommaSeparator",
SerdeAsSeparator::Space => "oas3_gen_support::StringWithSpaceSeparator",
SerdeAsSeparator::Pipe => "oas3_gen_support::StringWithPipeSeparator",
}
}
}
impl ToTokens for SerdeAsSeparator {
fn to_tokens(&self, tokens: &mut TokenStream) {
let separator_type = match self {
SerdeAsSeparator::Comma => quote! { oas3_gen_support::StringWithCommaSeparator },
SerdeAsSeparator::Space => quote! { oas3_gen_support::StringWithSpaceSeparator },
SerdeAsSeparator::Pipe => quote! { oas3_gen_support::StringWithPipeSeparator },
};
tokens.extend(separator_type);
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SerdeAsFieldAttr {
SeparatedList {
separator: SerdeAsSeparator,
optional: bool,
},
}
impl ToTokens for SerdeAsFieldAttr {
fn to_tokens(&self, tokens: &mut TokenStream) {
let attr = match self {
SerdeAsFieldAttr::SeparatedList { separator, optional } => {
let type_str = if *optional {
format!("Option<{}>", separator.type_path())
} else {
separator.type_path().to_string()
};
quote! { #[serde_as(as = #type_str)] }
}
};
tokens.extend(attr);
}
}