use std::path::Path;
use stackless_core::substrate::SpendInfo;
use stackless_stripe_projects::project;
use stackless_stripe_projects::stripe::{StripeProjects, TokioRunner};
pub async fn fetch(
definition_dir: &Path,
provider: &str,
cap_usd: u32,
dashboard: &str,
) -> SpendInfo {
let stripe = StripeProjects::new(TokioRunner, definition_dir.to_path_buf());
match project::spend_summary(&stripe).await {
Some(data) => {
let summary = format!("spend: {data}");
let parsed = serde_json::from_str::<serde_json::Value>(&data).ok();
SpendInfo {
provider: provider.to_owned(),
cap_usd,
summary,
data: parsed.or(Some(serde_json::Value::String(data))),
}
}
None => SpendInfo {
provider: provider.to_owned(),
cap_usd,
summary: format!(
"spend: unavailable from the plugin; hard cap is ${cap_usd}/mo \
(provider {provider}) — see {dashboard}"
),
data: None,
},
}
}
pub async fn line(definition_dir: &Path, provider: &str, cap_usd: u32, dashboard: &str) -> String {
fetch(definition_dir, provider, cap_usd, dashboard)
.await
.summary
}