use std::collections::HashMap;
use crate::decimal::Decimal;
use crate::parser::posting::Posting;
pub(crate) fn render_account(p: &Posting) -> String {
match (p.is_virtual, p.balanced) {
(true, true) => format!("[{}]", p.account),
(true, false) => format!("({})", p.account),
(false, _) => p.account.clone(),
}
}
pub(crate) fn write_spaces<W: std::io::Write>(out: &mut W, n: usize) -> std::io::Result<()> {
for _ in 0..n {
out.write_all(b" ")?;
}
Ok(())
}
pub(crate) fn push_spaces(out: &mut String, n: usize) {
out.reserve(n);
for _ in 0..n {
out.push(' ');
}
}
pub(crate) fn shows_nonzero(
commodity: &str,
value: &Decimal,
precisions: &HashMap<String, usize>,
) -> bool {
let prec = precisions.get(commodity).copied().unwrap_or(2);
!value.is_display_zero(prec)
}
pub(crate) fn format_amount(
commodity: &str,
value: &Decimal,
precisions: &HashMap<String, usize>,
) -> String {
let prec = precisions.get(commodity).copied().unwrap_or(2);
let formatted = value.format_decimal(prec);
let formatted = if let Some(without_minus) = formatted.strip_prefix('-') {
if without_minus.chars().all(|c| c == '0' || c == '.') {
without_minus.to_string()
} else {
formatted
}
} else {
formatted
};
format!("{}{}", commodity, formatted)
}