mod config;
mod credential;
mod endpoints;
mod helpers;
mod kinds;
mod live;
mod message;
mod model_info;
mod parts;
mod request;
mod stream;
use serde_json::Value;
use crate::types::ValidationError;
pub(crate) use helpers::{float_from_value, int_from_value};
pub use kinds::{roundtrip, validate, KINDS};
pub trait Canonical: Sized {
fn from_json(value: &Value) -> Result<Self, ValidationError>;
fn to_json(&self) -> Value;
fn from_json_str(text: &str) -> Result<Self, ValidationError> {
let value: Value = serde_json::from_str(text)
.map_err(|e| ValidationError::value(format!("invalid JSON: {e}")))?;
Self::from_json(&value)
}
fn to_json_string(&self) -> String {
self.to_json().to_string()
}
}
macro_rules! impl_serde_via_canonical {
($($ty:ty),+ $(,)?) => {
$(
impl ::serde::Serialize for $ty {
fn serialize<S: ::serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
$crate::serde::Canonical::to_json(self).serialize(serializer)
}
}
impl<'de> ::serde::Deserialize<'de> for $ty {
fn deserialize<D: ::serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = ::serde_json::Value::deserialize(deserializer)?;
<$ty as $crate::serde::Canonical>::from_json(&value).map_err(::serde::de::Error::custom)
}
}
)+
};
}
pub(crate) use impl_serde_via_canonical;