zcfg_flag_parser

Crates.iozcfg_flag_parser
lib.rszcfg_flag_parser
version0.2.0
sourcesrc
created_at2017-07-15 03:56:11.525518
updated_at2017-12-01 02:16:22.480312
descriptionPopulate all zcfg configured libraries in your binary using command line flags.
homepage
repositoryhttps://github.com/acmcarther/zcfg
max_upload_size
id23427
size6,064
Alex McArther (acmcarther)

documentation

README

zcfg

zcfg is a simple configuration library. It lets you define configurable values for your Rust library, without coupling you to a particular parsing format, or requiring plumbing in the binary.

Unlike other common configuration or flag libraries, you do not need to propagate internal details of your application into main, and you do not need to force users to configure internal details of your library if they choose not to.

It is inspired by gflags and similar global configuration systems.

Features

  • Define configuration values right where they're relevant
#![feature(used)]
#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate zcfg;

define_pub_cfg!(net_protocol_timeout_ms, u32, 20000,
                "How long the server or client should wait before considering \
                this connection timed out.")
  • Access the values while initializing your domain objects
struct NetProtocolClient {
  timeout_ms: u32,
}

impl Default for NetProtocolClient {
  fn default() -> NetProtocolClient {
    NetProtocolClient {
      timeout_ms: net_protocol_timeout_ms::CONFIG.get_value(),
    }
  }
}
  • Let binaries decide how they'd like to bring in config values
extern crate zcfg;
extern crate zcfg_flag_parser;

use zcfg_flag_parser::FlagParser;

fn main() {
  // Parse flags for all linked crates via command line
  FlagParser::new().parse_from_args(env::args().skip(1)).unwrap();
}
  • Make any of your types configurable
use zcfg::ConfigParsable;

enum BuildStrategy {
  Local,
  Remote {
    addr: String,
  }
}
impl ConfigParsable for BuildStrategy { ... }

define_cfg!(use_build_strategy, BuildStrategy, BuildStrategy::Local,
            "Defines how the build planner performs compilation. Options are \
             [Local] or [Remote(\"some_address\")].")

Best Practices

  • Limit access of configs to object initialization under default confitions to preserve testability

  • Consider define_pub_cfg if you'd like other modules to use the config.

  • Ensure that default values are useful -- users may not perform config population at all.

Roadmap

  • A "Help" functionality that emits config names, default values, and config descriptions for public consumption
  • Build on stable! zcfg currently depends on the experimental used feature to prevent config initializers from being dropped by the compiler.

How it works

Really dark stuff. zcfg uses a combination of linker flags and the used experimental feature to enqueue all flags defined in linked libraries in a global list, which main can populate without knowing about.

Commit count: 22

cargo fmt