#logging #interface #cli #parser

cli-batteries

Batteries included opinionated command line interfaces

17 unstable releases (4 breaking)

0.5.0 Apr 18, 2023
0.4.1 Nov 26, 2022
0.4.0 Oct 8, 2022
0.3.3 Aug 10, 2022
0.1.4 May 30, 2022

#918 in Command-line interface


Used in 2 crates

MIT license

79KB
1.5K SLoC

Rust 1.5K SLoC // 0.1% comments Python 177 SLoC // 0.3% comments

CLI Batteries

crates.io docs.rs MIT License dependency status codecov CI

Opinionated batteries-included command line interface runtime utilities.

To use it, add it to your Cargo.toml

[dependencies]
cli-batteries = "0.1"

[build-dependencies]
cli-batteries = "0.1"

and call the build_rs function in your build.rs

fn main() {
    cli_batteries::build_rs().unwrap()
}

Then in your src/main.rs you define app specific command line arguments using [clap::Parser][clap] and run the app as follows

use cli_batteries::{version, Parser};
use std::{path::PathBuf, io::Result};
use tokio::fs::File;

#[derive(Parser)]
#[group(skip)]
struct Options {
    /// File to read
    #[clap(long, env, default_value = "Readme.md")]
    file: PathBuf,
}

async fn app(options: Options) -> Result<()> {
    let mut file = File::open(options.file).await?;
    Ok(())
}

fn main() {
    cli_batteries::run(version!(), app);
}

You can see this working in the example project.

Features

  • signals: Handle Ctrl-C, SIGINT and SIGTERM with gracefull shutdown.
  • mimalloc: Use the mimalloc allocator with security hardening features enabled.
  • rand: Log and configure random seeds.
  • rayon: Log and configure number of threads.
  • prometheus: Start a Prometheus metrics server.
  • metered-allocator: Collect metric on memory allocation, enables prometheus.
  • mock-shutdown: Enable the reset_shutdown function that allows re-arming shutdown for testing.
  • tokio-console: Enable the --tokio-console option to start a Tokio console server on http://127.0.0.1:6669/ for async inspection.
  • otlp: Enable the --trace-otlp option to push traces to an OpenTelementry collector.

Building and testing

Format, lint, build and test everything (I recommend creating a shell alias for this):

cargo fmt &&\
cargo clippy --all-features --all-targets &&\
cargo test --workspace --all-features --doc -- --nocapture &&\
cargo test --workspace --all-features --all-targets -- --nocapture &&\
cargo doc --workspace --all-features --no-deps

Check documentation coverage

RUSTDOCFLAGS="-Z unstable-options --show-coverage"  cargo doc --workspace --all-features --no-deps

To do

Goals:

Maybe:


lines of code GitHub contributors GitHub issues GitHub pull requests GitHub Repo stars crates.io

Dependencies

~21–40MB
~616K SLoC