refactor(cheddar): Switch to clap-rs for command line arguments
The complexity of the arg parsing is increasing somewhat because we're adding more features to cheddar, so to set us up for that this switches the arg parsing to the somewhat more flexible clap. Change-Id: I187bc0c1b6c6bd596fa0f6bb494b04e335262ba9 Reviewed-on: https://cl.tvl.fyi/c/depot/+/445 Reviewed-by: lukegb <lukegb@tvl.fyi> Reviewed-by: tazjin <mail@tazj.in>
This commit is contained in:
parent
51594b0594
commit
5e5e02d6a7
3 changed files with 29 additions and 30 deletions
1
tools/cheddar/Cargo.lock
generated
1
tools/cheddar/Cargo.lock
generated
|
@ -98,6 +98,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
name = "cheddar"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"comrak 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syntect 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
|
@ -8,3 +8,4 @@ edition = "2018"
|
|||
comrak = "0.7"
|
||||
lazy_static = "1.4"
|
||||
syntect = "4.2.0"
|
||||
clap = "2.33"
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
use clap::{Arg, App};
|
||||
use comrak::arena_tree::Node;
|
||||
use comrak::nodes::{Ast, AstNode, NodeValue, NodeCodeBlock, NodeHtmlBlock};
|
||||
use comrak::{Arena, parse_document, format_html, ComrakOptions};
|
||||
|
@ -72,35 +73,6 @@ struct Args {
|
|||
lang_override: Option<&'static str>,
|
||||
}
|
||||
|
||||
/// Parse the command-line flags passed to cheddar to determine
|
||||
/// whether it is running in about-filter mode (`--about-filter`) and
|
||||
/// what file extension has been supplied.
|
||||
fn parse_args() -> Args {
|
||||
let mut args = Args::default();
|
||||
|
||||
for (i, arg) in env::args().enumerate() {
|
||||
if i == 0 {
|
||||
continue;
|
||||
}
|
||||
|
||||
if arg == "--about-filter" {
|
||||
args.about_filter = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if let Some(lang) = (*FILENAME_OVERRIDES).get(arg.as_str()) {
|
||||
args.lang_override = Some(lang);
|
||||
}
|
||||
|
||||
args.extension = Path::new(&arg)
|
||||
.extension()
|
||||
.and_then(OsStr::to_str)
|
||||
.map(|s| s.to_string());
|
||||
}
|
||||
|
||||
return args
|
||||
}
|
||||
|
||||
fn should_continue(res: &io::Result<usize>) -> bool {
|
||||
match *res {
|
||||
Ok(n) => n > 0,
|
||||
|
@ -312,7 +284,32 @@ fn format_code(args: &Args) {
|
|||
}
|
||||
|
||||
fn main() {
|
||||
let args = parse_args();
|
||||
// Parse the command-line flags passed to cheddar to determine
|
||||
// whether it is running in about-filter mode (`--about-filter`)
|
||||
// and what file extension has been supplied.
|
||||
let matches = App::new("cheddar")
|
||||
.about("TVL's syntax highlighter")
|
||||
.arg(Arg::with_name("about-filter")
|
||||
.help("Run as a cgit about-filter (renders Markdown)")
|
||||
.long("about-filter")
|
||||
.takes_value(false))
|
||||
.arg(Arg::with_name("filename")
|
||||
.help("File to render")
|
||||
.index(1))
|
||||
.get_matches();
|
||||
|
||||
let mut args = Args::default();
|
||||
args.about_filter = matches.is_present("about-filter");
|
||||
|
||||
let filename = matches.value_of("filename").expect("filename is required");
|
||||
if let Some(lang) = (*FILENAME_OVERRIDES).get(filename) {
|
||||
args.lang_override = Some(lang);
|
||||
}
|
||||
|
||||
args.extension = Path::new(&filename)
|
||||
.extension()
|
||||
.and_then(OsStr::to_str)
|
||||
.map(|s| s.to_string());
|
||||
|
||||
match args.extension.as_ref().map(String::as_str) {
|
||||
Some("md") if args.about_filter => format_markdown(),
|
||||
|
|
Loading…
Reference in a new issue