use crate::Provider;
pub trait Error: std::fmt::Debug {
fn kind(&self) -> ErrorKind;
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
#[non_exhaustive]
pub enum ErrorKind {
NoData,
DeserializationFailed,
BadSchema,
}
impl std::fmt::Display for ErrorKind {
fn fmt(
&self,
f: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
match self {
ErrorKind::NoData => {
write!(f, "No data extracted")
}
ErrorKind::DeserializationFailed => {
write!(f, "Failed to deserialize data")
}
ErrorKind::BadSchema => write!(
f,
"Response violated schema constraints"
),
}
}
}
impl Error for ErrorKind {
#[inline]
fn kind(&self) -> ErrorKind {
*self
}
}
pub trait Extract<T>: Provider
where
Self::Error: Error,
{
type Prompt;
type Content;
fn extract(
&mut self,
prompt: Self::Prompt,
content: Self::Content,
) -> Result<T, Self::Error>;
}
impl<C, T> Extract<T> for &mut C
where
C: Extract<T> + ?Sized,
C::Error: Error,
{
type Prompt = C::Prompt;
type Content = C::Content;
fn extract(
&mut self,
prompt: Self::Prompt,
content: Self::Content,
) -> Result<T, Self::Error> {
C::extract(self, prompt, content)
}
}