use beanru::types::Currency;
use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Args {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Normalize {
input: String,
#[arg(short, long, default_value_t = false)]
in_place: bool,
},
Check { input: String },
StockSplit {
input: String,
commodity: String,
ratio: rust_decimal::Decimal,
#[arg(short, long, default_value_t = false)]
in_place: bool,
},
Closing {
input: String,
#[arg(short, long, default_value_t = 15)]
days: i64,
#[arg(short, long, default_value_t = false)]
in_place: bool,
},
}
fn main() -> anyhow::Result<()> {
let args = Args::parse();
match args.command {
Commands::Normalize { input, in_place } => {
let content = std::fs::read_to_string(&input)?;
let beancount = beanru::parse(&content)?;
if in_place {
std::fs::write(&input, beancount.to_string())?;
} else {
println!("{}", beancount);
}
}
Commands::Check { input } => {
let content = std::fs::read_to_string(input)?;
let beancount = beanru::parse(&content)?;
beanru::check(&beancount)?;
}
Commands::StockSplit {
input,
commodity,
ratio,
in_place,
} => {
let content = std::fs::read_to_string(&input)?;
let mut beancount = beanru::parse(&content)?;
beanru::split_stock(&mut beancount, &Currency(commodity), ratio)?;
if in_place {
std::fs::write(&input, beancount.to_string())?;
} else {
println!("{}", beancount);
}
}
Commands::Closing {
input,
days,
in_place,
} => {
let content = std::fs::read_to_string(&input)?;
let mut beancount = beanru::parse(&content)?;
beanru::closing(&mut beancount, days)?;
if in_place {
std::fs::write(&input, beancount.to_string())?;
} else {
println!("{}", beancount);
}
}
}
Ok(())
}