use serde_json::Value;
use super::{CacheRetention, Reasoning, ServiceTier, Verbosity};
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct OptionFields<'a> {
pub reasoning: Option<&'a Reasoning>,
pub cache: Option<&'a CacheRetention>,
pub service_tier: Option<&'a ServiceTier>,
pub verbosity: Option<&'a Verbosity>,
pub parallel_tool_calls: Option<bool>,
pub top_p: Option<f64>,
pub seed: Option<u64>,
pub stop: &'a [String],
}
impl OptionFields<'_> {
pub(super) fn set(&self) -> [bool; 8] {
let OptionFields {
reasoning,
cache,
service_tier,
verbosity,
parallel_tool_calls,
top_p,
seed,
stop,
} = self;
[
reasoning.is_some(),
cache.is_some(),
service_tier.is_some(),
verbosity.is_some(),
parallel_tool_calls.is_some(),
top_p.is_some(),
seed.is_some(),
!stop.is_empty(),
]
}
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq)]
pub enum Mapping {
Nothing,
Send(Value),
Omit(&'static str),
Place,
Unsupported(String),
}
impl Mapping {
pub fn of<T>(value: Option<T>, map: impl FnOnce(T) -> Mapping) -> Mapping {
value.map_or(Mapping::Nothing, map)
}
pub fn of_stop(stop: &[String], map: impl FnOnce(&[String]) -> Mapping) -> Mapping {
if stop.is_empty() {
Mapping::Nothing
} else {
map(stop)
}
}
pub fn unsupported(reason: impl Into<String>) -> Mapping {
Mapping::Unsupported(reason.into())
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct OptionMap {
pub reasoning: Mapping,
pub cache: Mapping,
pub service_tier: Mapping,
pub verbosity: Mapping,
pub parallel_tool_calls: Mapping,
pub top_p: Mapping,
pub seed: Mapping,
pub stop: Mapping,
}
impl OptionMap {
pub(super) fn into_slots(self) -> [(&'static str, Mapping); 8] {
let OptionMap {
reasoning,
cache,
service_tier,
verbosity,
parallel_tool_calls,
top_p,
seed,
stop,
} = self;
[
("reasoning", reasoning),
("cache", cache),
("service_tier", service_tier),
("verbosity", verbosity),
("parallel_tool_calls", parallel_tool_calls),
("top_p", top_p),
("seed", seed),
("stop", stop),
]
}
}