3 releases (breaking)
Uses old Rust 2015
0.10.0 | May 13, 2019 |
---|---|
0.9.0 | Dec 20, 2017 |
0.8.0 | Mar 20, 2017 |
#333 in Configuration
2,488 downloads per month
Used in 5 crates
15KB
113 lines
Features
About
features
is a small library that implements runtime feature toggles for
your library or program allowing behavior to be changed on boot or dynamically at runtime using
the same compiled binary artifact. This is different from cargo's feature
support which uses conditional compilation.
At its core, it is a macro (features!
) that takes a collection of feature flag names which it
uses to generate a module containing a function to enable a feature toggle (::enable()
), a
function to disable a feature toggle (::disable()
) and a function to check if a feature
toggle is enabled (::is_enabled()
).
Example
Basic example:
#[macro_use]
extern crate bitflags;
#[macro_use]
extern crate features;
features! {
pub mod feature {
const Alpha = 0b00000001,
const Beta = 0b00000010
}
}
fn main() {
assert_eq!(false, feature::is_enabled(feature::Alpha));
assert_eq!(false, feature::is_enabled(feature::Beta));
feature::enable(feature::Beta);
assert_eq!(false, feature::is_enabled(feature::Alpha));
assert_eq!(true, feature::is_enabled(feature::Beta));
}
Multiple feature sets:
#[macro_use]
extern crate bitflags;
#[macro_use]
extern crate features;
features! {
pub mod ux {
const JsonOutput = 0b10000000,
const VerboseOutput = 0b01000000
}
}
features! {
pub mod srv {
const Http2Downloading = 0b10000000,
const BitTorrentDownloading = 0b01000000
}
}
fn main() {
// Parse CLI args, environment, read config file etc...
srv::enable(srv::BitTorrentDownloading);
ux::enable(ux::JsonOutput);
if srv::is_enabled(srv::Http2Downloading) {
println!("Downloading via http2...");
} else if srv::is_enabled(srv::BitTorrentDownloading) {
println!("Downloading via bit torrent...");
} else {
println!("Downloading the old fashioned way...");
}
if ux::is_enabled(ux::VerboseOutput) {
println!("COOL");
}
}
Feature Toggle References
Here are some articles and projects which insipred the implementation of features
:
- Feature Toggles (Martin Fowler's blog)
- Using Feature Flags to Ship Changes with Confidence (TravisCI's blog)
- Feature Toggles are one of the worst kinds of Technical Debt (excellent cautionary tale and warning)
- Feature toggle (Wikipedia article)
- Ruby feature gem (nice prior art)
License
Features is licensed under the Apache License, Version 2.0 and the MIT license. Please read the LICENSE-APACHE and LICENSE-MIT for details
Dependencies
~105KB