use napi_derive::napi;
#[napi(object)]
pub struct JsUsagePeriod {
pub utilization: f64,
pub resets_at: String,
}
#[napi(object)]
pub struct JsExtraUsage {
pub is_enabled: bool,
pub amount_used: Option<f64>,
pub limit: Option<f64>,
}
#[napi(object)]
pub struct JsUsageData {
pub five_hour: JsUsagePeriod,
pub seven_day: JsUsagePeriod,
pub seven_day_sonnet: Option<JsUsagePeriod>,
pub extra_usage: Option<JsExtraUsage>,
}
impl From<&crate::types::UsagePeriod> for JsUsagePeriod {
fn from(period: &crate::types::UsagePeriod) -> Self {
Self {
utilization: period.utilization,
resets_at: period.resets_at.to_rfc3339(),
}
}
}
impl From<&crate::types::ExtraUsage> for JsExtraUsage {
fn from(extra: &crate::types::ExtraUsage) -> Self {
Self {
is_enabled: extra.is_enabled,
amount_used: extra.amount_used,
limit: extra.limit,
}
}
}
impl From<crate::types::UsageData> for JsUsageData {
fn from(usage: crate::types::UsageData) -> Self {
Self {
five_hour: JsUsagePeriod::from(&usage.five_hour),
seven_day: JsUsagePeriod::from(&usage.seven_day),
seven_day_sonnet: usage.seven_day_sonnet.as_ref().map(JsUsagePeriod::from),
extra_usage: usage.extra_usage.as_ref().map(JsExtraUsage::from),
}
}
}
#[napi]
#[cfg(feature = "blocking")]
pub fn get_usage() -> napi::Result<JsUsageData> {
let usage = crate::get_usage().map_err(|e| napi::Error::from_reason(e.to_string()))?;
Ok(JsUsageData::from(usage))
}
#[napi]
pub fn is_on_pace(utilization: f64, resets_at: String, period_hours: u32) -> napi::Result<bool> {
let parsed = chrono::DateTime::parse_from_rfc3339(&resets_at)
.map_err(|_| napi::Error::from_reason("Invalid RFC3339 timestamp for resets_at"))?;
let period = crate::types::UsagePeriod {
utilization,
resets_at: parsed.with_timezone(&chrono::Utc),
};
Ok(period.is_on_pace(period_hours))
}