use serde::{Deserialize, Serialize};
use crate::budget::UsdMicros;
use crate::error::AxError;
use crate::model::ModelUsage;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(untagged)]
pub enum CacheRenewed {
Refused {
refused: AxError,
},
Answered {
#[serde(default, skip_serializing_if = "Option::is_none")]
#[cfg_attr(
feature = "schema",
schemars(with = "Option<std::collections::BTreeMap<String, u64>>")
)]
usage: Option<ModelUsage>,
#[serde(default, skip_serializing_if = "Option::is_none")]
billed_usd_micros: Option<UsdMicros>,
},
}
#[cfg(test)]
#[allow(clippy::unwrap_used, reason = "test code")]
mod tests {
use super::*;
use crate::event::Payload;
#[test]
fn a_refusal_reads_back_as_a_refusal_and_an_empty_answer_as_an_answer() {
let refused = CacheRenewed::Refused {
refused: AxError::failure(
crate::error::AxCode::Provider,
"renew a cached prefix",
"rate limited",
)
.with_recovery("renewal is skipped until the next real request"),
};
let answered = CacheRenewed::Answered {
usage: None,
billed_usd_micros: None,
};
for line in [refused, answered] {
assert_eq!(
Payload::of(&line).unwrap().read::<CacheRenewed>().unwrap(),
line
);
}
}
}