use std::collections::BTreeMap;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema)]
#[schemars(transform = crate::schema::strip_int_formats)]
pub struct ModelPricing {
pub input_micros_per_million_tokens: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct PricingTable {
pub version: String,
pub currency: String,
pub models: BTreeMap<String, ModelPricing>,
}
impl PricingTable {
#[must_use]
pub fn cost_micros(&self, model: &str, tokens: u64) -> Option<u64> {
let rate = self.models.get(model)?.input_micros_per_million_tokens;
Some(tokens.saturating_mul(rate) / 1_000_000)
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
#[schemars(transform = crate::schema::strip_int_formats)]
pub struct CompilationInsights {
pub tokens_in: u64,
pub tokens_out: u64,
pub tokens_saved: u64,
pub tokens_saved_by_rule: BTreeMap<String, u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub estimated_cost_saved_micros: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pricing_version: Option<String>,
}
#[cfg(test)]
#[path = "insights_tests.rs"]
mod tests;