1use crate::{Format, Runnable};
2use anyhow::Result;
3use clap::Parser;
4use std::{fs::File, path::PathBuf};
5
6mod cancel;
7mod pause;
8mod resume;
9mod start;
10mod status;
11
12use cancel::BalanceCancelCommand;
13use pause::BalancePauseCommand;
14use resume::BalanceResumeCommand;
15use start::BalanceStartCommand;
16use status::BalanceStatusCommand;
17
18#[derive(Parser, Debug)]
25pub struct BalanceCommand {
26 #[clap(subcommand)]
27 pub subcommand: BalanceSubcommand,
28}
29
30impl Runnable for BalanceCommand {
31 fn run(&self, format: Format, dry_run: bool) -> Result<()> {
32 match &self.subcommand {
33 BalanceSubcommand::Start(cmd) => cmd.run(format, dry_run),
34 BalanceSubcommand::Pause(cmd) => cmd.run(format, dry_run),
35 BalanceSubcommand::Cancel(cmd) => cmd.run(format, dry_run),
36 BalanceSubcommand::Resume(cmd) => cmd.run(format, dry_run),
37 BalanceSubcommand::Status(cmd) => cmd.run(format, dry_run),
38 }
39 }
40}
41
42#[derive(Parser, Debug)]
43pub enum BalanceSubcommand {
44 Start(BalanceStartCommand),
45 Pause(BalancePauseCommand),
46 Cancel(BalanceCancelCommand),
47 Resume(BalanceResumeCommand),
48 Status(BalanceStatusCommand),
49}
50
51fn open_path(path: &PathBuf) -> Result<File> {
53 use anyhow::Context;
54 File::open(path).with_context(|| format!("failed to open '{}'", path.display()))
55}