extern crate clap; extern crate libimagrt; extern crate libimagentrytag; extern crate libimagutil; #[macro_use] extern crate version; use clap::Shell; use libimagrt::runtime::Runtime; /// This macro generates mods with the given '$modulename', /// whose content is the file given with `$path`. /// In this case, It is used specifically to include the /// `ui.rs` files of the imag binaries. /// The imag project (accidentally?) followed the convention /// to write a `ui.rs` containing the function /// `fn build_ui(app : App) -> App`. /// This macro allows us to use the same named functions by /// putting them each into their own module. macro_rules! gen_mods_buildui { ($(($path:expr, $modulename:ident)$(,)*)*) => ( $( mod $modulename { include!($path); } )* ) } /// This macro reduces boilerplate code. /// /// For example: `build_subcommand!("counter", imagcounter)` /// will result in the following code: /// ```ignore /// imagcounter::build_ui(Runtime::get_default_cli_builder( /// "counter", /// &version!()[..], /// "counter")) /// ``` /// As for the `&version!()[..]` part, it does not matter /// which version the subcommand is getting here, as the /// output of this script is a completion script, which /// does not contain information about the version at all. macro_rules! build_subcommand { ($name:expr, $module:ident) => ( $module::build_ui(Runtime::get_default_cli_builder( $name, &version!()[..], $name)) ) } // Actually generates the module. gen_mods_buildui!( ("../imag-link/src/ui.rs", imaglink), ("../imag-notes/src/ui.rs", imagnotes), ("../imag-ref/src/ui.rs", imagref), ("../imag-store/src/ui.rs", imagstore), ("../imag-tag/src/ui.rs", imagtag), ("../imag-view/src/ui.rs", imagview) ); fn main() { // Make the `imag`-App... let mut app = Runtime::get_default_cli_builder( "imag", &version!()[..], "imag") // and add all the subapps as subcommands. .subcommand(build_subcommand!("link", imaglink)) .subcommand(build_subcommand!("notes", imagnotes)) .subcommand(build_subcommand!("ref", imagref)) .subcommand(build_subcommand!("store", imagstore)) .subcommand(build_subcommand!("tag", imagtag)) .subcommand(build_subcommand!("view", imagview)); let outdir = std::env::var("OUT_DIR").unwrap(); // Actually generates the completion files app.gen_completions("imag", Shell::Bash, outdir); app.gen_completions("imag", Shell::Fish, outdir); app.gen_completions("imag", Shell::Zsh, outdir); }