#feature #flag #toggle

features

A macro to generate runtime feature toggles

2 unstable releases

0.9.0 Dec 20, 2017
0.8.0 Mar 20, 2017

#40 in Development tools

Download history 236/week @ 2018-09-20 234/week @ 2018-09-27 283/week @ 2018-10-04 240/week @ 2018-10-11 362/week @ 2018-10-18 340/week @ 2018-10-25 339/week @ 2018-11-01 327/week @ 2018-11-08 342/week @ 2018-11-15 106/week @ 2018-11-22 293/week @ 2018-11-29 202/week @ 2018-12-06 242/week @ 2018-12-13

344 downloads per month

MIT/Apache

15KB
113 lines

Features

Crate version Crate downloads Crate license Documentation

AppVeyor (Windows) Travis (Linux and OS X)

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:

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

~23KB