use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PolicyKind {
Budget,
RateLimit,
Guardrail,
Preset,
}
impl PolicyKind {
pub fn as_str(self) -> &'static str {
match self {
PolicyKind::Budget => "budget",
PolicyKind::RateLimit => "rate_limit",
PolicyKind::Guardrail => "guardrail",
PolicyKind::Preset => "preset",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BudgetWindow {
Day,
Month,
Total,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ByokRequirement {
Required,
Forbidden,
Optional,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ClientType {
Confidential,
Public,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn policy_kind_round_trips_through_json() -> anyhow::Result<()> {
for k in [
PolicyKind::Budget,
PolicyKind::RateLimit,
PolicyKind::Guardrail,
PolicyKind::Preset,
] {
let s = serde_json::to_string(&k)?;
let back: PolicyKind = serde_json::from_str(&s)?;
assert_eq!(back, k);
}
Ok(())
}
#[test]
fn budget_window_wire_form_is_snake_case() -> anyhow::Result<()> {
assert_eq!(serde_json::to_string(&BudgetWindow::Day)?, "\"day\"");
assert_eq!(serde_json::to_string(&BudgetWindow::Month)?, "\"month\"");
assert_eq!(serde_json::to_string(&BudgetWindow::Total)?, "\"total\"");
Ok(())
}
#[test]
fn client_type_wire_form_is_snake_case() -> anyhow::Result<()> {
assert_eq!(
serde_json::to_string(&ClientType::Confidential)?,
"\"confidential\""
);
assert_eq!(serde_json::to_string(&ClientType::Public)?, "\"public\"");
Ok(())
}
#[test]
fn byok_requirement_wire_form_is_snake_case() -> anyhow::Result<()> {
assert_eq!(
serde_json::to_string(&ByokRequirement::Required)?,
"\"required\""
);
assert_eq!(
serde_json::to_string(&ByokRequirement::Forbidden)?,
"\"forbidden\""
);
assert_eq!(
serde_json::to_string(&ByokRequirement::Optional)?,
"\"optional\""
);
Ok(())
}
}