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)]
pub enum SerdeAsSeparator {
Comma,
Space,
Pipe,
}
impl ToTokens for SerdeAsSeparator {
fn to_tokens(&self, tokens: &mut TokenStream) {
let separator_type = match self {
Self::Comma => quote! { oas3_gen_support::StringWithCommaSeparator },
Self::Space => quote! { oas3_gen_support::StringWithSpaceSeparator },
Self::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 Self::SeparatedList { separator, optional } = self;
let attr = if *optional {
quote! { #[serde_as(as = Option<#separator>)] }
} else {
quote! { #[serde_as(as = #separator)] }
};
tokens.extend(attr);
}
}