1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
//!
//! the mark up text with cycling color program.
//!
//! ```text
//! Usage:
//! aki-mcycle [options]
//!
//! mark up text with the cyclic color.
//!
//! Options:
//! -e, --exp <exp> write it in the cyclic color (default: ' ([0-9A-Z]{3,}):')
//!
//! -H, --help display this help and exit
//! -V, --version display version information and exit
//!
//! Option Parameters:
//! <exp> regular expression, color the entire match with the cyclic color.
//!
//! Environments:
//! AKI_MCYCLE_COLOR_SEQ_RED_ST red start sequence specified by ansi
//! AKI_MCYCLE_COLOR_SEQ_GREEN_ST green start sequence specified by ansi
//! AKI_MCYCLE_COLOR_SEQ_BLUE_ST blue start sequence specified by ansi
//! AKI_MCYCLE_COLOR_SEQ_CYAN_ST cyan start sequence specified by ansi
//! AKI_MCYCLE_COLOR_SEQ_MAGENDA_ST magenda start sequence specified by ansi
//! AKI_MCYCLE_COLOR_SEQ_YELLOW_ST yellow start sequence specified by ansi
//! AKI_MCYCLE_COLOR_SEQ_ED color end sequence specified by ansi
//! ```
//!
//!
//! # Examples
//!
//! ### Command line example 1
//!
//! Extract "`arm`" from the rustup target list and make "`linux-[^ ]+`" **color**.
//!
//! - 1st match: makes '`linux-musl`' **red**
//! - 2nd match: makes '`linux-musleabi`' **green**
//! - 3rd match: makes '`linux-musleabihf`' **blue**
//! - 4th match: makes '`linux-muslabi64`' **cyan**
//!
//! ```text
//! rustup target list | aki-mline -e arm | aki-mcycle -e "linux-[^ ]+"
//! ```
//!
//! result output :
//!
//! ![out rustup image]
//!
//! [out rustup image]: https://raw.githubusercontent.com/aki-akaguma/aki-mcycle/main/img/out-rustup-1.png
//!
//! - [aki-mline](https://crates.io/crates/aki-mline): extract match line command like grep.
//!
//! ### Library example
//!
//! See [`fn execute()`] for this library examples.
//!
//! [`fn execute()`]: crate::execute
//!
#[macro_use]
extern crate anyhow;
pub mod conf;
mod run;
mod util;
use flood_tide::HelpVersion;
use runnel::*;
use std::io::Write;
const TRY_HELP_MSG: &str = "Try --help for help.";
///
/// execute mcycle
///
/// params:
/// - sioe: stream in/out/err
/// - program: program name. etc. "mcycle"
/// - args: parameter arguments.
///
/// return:
/// - ok: ()
/// - err: anyhow
///
/// example:
///
/// ```
/// use runnel::RunnelIoeBuilder;
///
/// let r = libaki_mcycle::execute(&RunnelIoeBuilder::new().build(),
/// "mcycle", &["-e", "Message: *[^ ]+"]);
/// ```
///
pub fn execute(sioe: &RunnelIoe, prog_name: &str, args: &[&str]) -> anyhow::Result<()> {
let env = conf::EnvConf::new();
execute_env(sioe, prog_name, args, &env)
}
pub fn execute_env(
sioe: &RunnelIoe,
prog_name: &str,
args: &[&str],
env: &conf::EnvConf,
) -> anyhow::Result<()> {
let conf = match conf::parse_cmdopts(prog_name, args) {
Ok(conf) => conf,
Err(errs) => {
for err in errs.iter().take(1) {
if err.is_help() || err.is_version() {
let _r = sioe.pout().lock().write_fmt(format_args!("{}\n", err));
return Ok(());
}
}
return Err(anyhow!("{}\n{}", errs, TRY_HELP_MSG));
}
};
run::run(sioe, &conf, env)
}