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 {
Self::SkipSerializingNone => quote! { #[serde_with::skip_serializing_none] },
Self::SerdeAs => quote! { #[serde_with::serde_as] },
};
tokens.extend(attr);
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, strum::AsRefStr)]
pub enum SerdeAsSeparator {
#[strum(serialize = "oas3_gen_support::StringWithCommaSeparator")]
Comma,
#[strum(serialize = "oas3_gen_support::StringWithSpaceSeparator")]
Space,
#[strum(serialize = "oas3_gen_support::StringWithPipeSeparator")]
Pipe,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SerdeAsFieldAttr {
SeparatedList {
separator: SerdeAsSeparator,
optional: bool,
},
CustomOverride {
custom_type: String,
optional: bool,
is_array: bool,
},
}
impl ToTokens for SerdeAsFieldAttr {
fn to_tokens(&self, tokens: &mut TokenStream) {
let type_str = match self {
Self::SeparatedList { separator, optional } => {
if *optional {
format!("Option<{}>", separator.as_ref())
} else {
separator.as_ref().to_string()
}
}
Self::CustomOverride {
custom_type,
optional,
is_array,
} => {
let mut result = custom_type.clone();
if *is_array {
result = format!("Vec<{result}>");
}
if *optional {
result = format!("Option<{result}>");
}
result
}
};
let attr = quote! { #[serde_as(as = #type_str)] };
tokens.extend(attr);
}
}