pub use openai_types::shared::{
AutoOrFixed, CompletionTokensDetails, FinishReason, ListResponse, MaxResponseTokens,
PromptTokensDetails, Role, SearchContextSize, ServiceTier, SortOrder, Usage,
};
pub use openai_types::shared::ReasoningEffort;
#[macro_export]
macro_rules! openai_enum {
(
$(#[$meta:meta])*
$vis:vis enum $name:ident {
$(
$(#[$var_meta:meta])*
$variant:ident = $json:literal
),*$(,)?
}
) => {
$(#[$meta])*
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
$vis enum $name {
$(
$(#[$var_meta])*
$variant,
)*
Other(String),
}
impl serde::Serialize for $name {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match self {
$(Self::$variant => serializer.serialize_str($json),)*
Self::Other(s) => serializer.serialize_str(s),
}
}
}
impl<'de> serde::Deserialize<'de> for $name {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
match s.as_str() {
$($json => Ok(Self::$variant),)*
_ => Ok(Self::Other(s)),
}
}
}
};
}
pub fn serialize_other<S>(value: &str, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(value)
}