about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2020-06-17T00·41+0100
committertazjin <mail@tazj.in>2020-06-17T01·18+0000
commit5e5e02d6a715042c69812d26357b956d7f53f1af (patch)
tree9770709c80d83066e64cad303481e3204a1d8814
parent51594b0594fe799c39d0a6a62317fb443d81a23a (diff)
refactor(cheddar): Switch to clap-rs for command line arguments r/1005
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>
-rw-r--r--tools/cheddar/Cargo.lock1
-rw-r--r--tools/cheddar/Cargo.toml1
-rw-r--r--tools/cheddar/src/main.rs57
3 files changed, 29 insertions, 30 deletions
diff --git a/tools/cheddar/Cargo.lock b/tools/cheddar/Cargo.lock
index be70e178abb7..ab1225cc6bea 100644
--- a/tools/cheddar/Cargo.lock
+++ b/tools/cheddar/Cargo.lock
@@ -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)",
diff --git a/tools/cheddar/Cargo.toml b/tools/cheddar/Cargo.toml
index ca9ed0dfe4ac..b7d9a775861d 100644
--- a/tools/cheddar/Cargo.toml
+++ b/tools/cheddar/Cargo.toml
@@ -8,3 +8,4 @@ edition = "2018"
 comrak = "0.7"
 lazy_static = "1.4"
 syntect = "4.2.0"
+clap = "2.33"
diff --git a/tools/cheddar/src/main.rs b/tools/cheddar/src/main.rs
index 01e6c868f7a9..9e16b1de439b 100644
--- a/tools/cheddar/src/main.rs
+++ b/tools/cheddar/src/main.rs
@@ -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(),