use super::{escape_string, format_incomplete_amount};
use crate::{Amount, CostSpec, PriceAnnotation};
pub fn format_amount(amount: &Amount) -> String {
format!("{} {}", amount.number, amount.currency)
}
pub fn format_cost_spec(spec: &CostSpec) -> String {
let mut parts = Vec::with_capacity(4);
if let (Some(num), Some(curr)) = (&spec.number_per, &spec.currency) {
parts.push(format!("{num} {curr}"));
} else if let (Some(num), Some(curr)) = (&spec.number_total, &spec.currency) {
return format!("{{{{{num} {curr}}}}}");
}
if let Some(date) = spec.date {
parts.push(date.to_string());
}
if let Some(label) = &spec.label {
parts.push(format!("\"{}\"", escape_string(label)));
}
if spec.merge {
parts.push("*".to_string());
}
format!("{{{}}}", parts.join(", "))
}
pub fn format_price_annotation(price: &PriceAnnotation) -> String {
match price {
PriceAnnotation::Unit(amount) => format!("@ {}", format_amount(amount)),
PriceAnnotation::Total(amount) => format!("@@ {}", format_amount(amount)),
PriceAnnotation::UnitIncomplete(inc) => format!("@ {}", format_incomplete_amount(inc)),
PriceAnnotation::TotalIncomplete(inc) => format!("@@ {}", format_incomplete_amount(inc)),
PriceAnnotation::UnitEmpty => "@".to_string(),
PriceAnnotation::TotalEmpty => "@@".to_string(),
}
}