pub fn estimate(text: &str) -> i64 {
if text.is_empty() {
return 0;
}
let bytes = text.len() as f64;
(bytes / 4.0).ceil() as i64
}
pub fn percent_saved(full: i64, sent: i64) -> u32 {
if full <= 0 {
return 0;
}
let saved = (full - sent).max(0) as f64;
((saved / full as f64) * 100.0).round() as u32
}
pub const DEFAULT_PRICE_PER_MTOK: f64 = 3.0;
pub const DEFAULT_CO2_G_PER_KTOK: f64 = 0.4;
pub fn price_per_mtok() -> f64 {
std::env::var("DRIP_PRICE_PER_MTOK")
.ok()
.and_then(|s| s.parse().ok())
.filter(|v: &f64| v.is_finite() && *v >= 0.0)
.unwrap_or(DEFAULT_PRICE_PER_MTOK)
}
pub fn co2_g_per_ktok() -> f64 {
std::env::var("DRIP_CO2_G_PER_KTOK")
.ok()
.and_then(|s| s.parse().ok())
.filter(|v: &f64| v.is_finite() && *v >= 0.0)
.unwrap_or(DEFAULT_CO2_G_PER_KTOK)
}
pub fn dollars_saved(tokens: i64) -> f64 {
(tokens.max(0) as f64 / 1_000_000.0) * price_per_mtok()
}
pub fn co2_g_saved(tokens: i64) -> f64 {
(tokens.max(0) as f64 / 1_000.0) * co2_g_per_ktok()
}