From d93090c61bf313222ff70bb477f8faa5893de3d7 Mon Sep 17 00:00:00 2001 From: DeveloperC Date: Sat, 12 Jul 2025 00:31:36 +0100 Subject: [PATCH] feat: adding verbose CLI option --- Cargo.lock | 120 +++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 ++ README.md | 9 ++-- src/cli/mod.rs | 11 +++++ src/main.rs | 13 +++++- 5 files changed, 150 insertions(+), 6 deletions(-) create mode 100644 src/cli/mod.rs diff --git a/Cargo.lock b/Cargo.lock index d15b4728..39467c13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,55 @@ dependencies = [ "memchr", ] +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys", +] + [[package]] name = "anyhow" version = "1.0.98" @@ -29,6 +78,52 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "clap" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + [[package]] name = "console" version = "0.15.8" @@ -132,6 +227,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -176,6 +277,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "lazy_static" version = "1.4.0" @@ -205,6 +312,7 @@ name = "monkey_interpreter" version = "0.16.1" dependencies = [ "anyhow", + "clap", "insta", "log", "pretty_env_logger", @@ -410,6 +518,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "syn" version = "2.0.87" @@ -473,6 +587,12 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index 86d8a015..b7bafaed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,9 @@ categories = ["command-line-utilities", "development-tools", "compilers", "text- log = "0.4.21" pretty_env_logger = "0.5.0" +# For CLI argument parsing. +clap = { version = "4.5.0", features = ["derive"] } + # For custom errors. thiserror = "2.0.0" diff --git a/README.md b/README.md index 73c49dd5..97f9d8cc 100644 --- a/README.md +++ b/README.md @@ -18,19 +18,18 @@ Monkey has a C-like syntax, supports **variable bindings**, **prefix** and **inf ## Content * [Usage](#usage) - + [Usage - Logging](#usage-logging) * [Compiling](#compiling) * [Unit Testing](#unit-testing) * [Issues/Feature Requests](#issuesfeature-requests) ## Usage +Run the interpreter via +```sh +monkey_interpreter +``` -### Usage - Logging -The crates `pretty_env_logger` and `log` are used to provide logging. -The environment variable `RUST_LOG` can be used to set the logging level. -See [https://crates.io/crates/pretty_env_logger](https://crates.io/crates/pretty_env_logger) for more detailed documentation. ## Compiling diff --git a/src/cli/mod.rs b/src/cli/mod.rs new file mode 100644 index 00000000..3fc0e661 --- /dev/null +++ b/src/cli/mod.rs @@ -0,0 +1,11 @@ +use clap::Parser; + +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +pub(crate) struct Arguments { + #[arg( + long, + help = "Enable verbose output, respects RUST_LOG environment variable if set." + )] + pub(crate) verbose: bool, +} diff --git a/src/main.rs b/src/main.rs index 541c5447..e78a76ee 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,18 +5,29 @@ extern crate pretty_env_logger; use std::io::{stdin, stdout, Write}; use anyhow::{Context, Result}; +use clap::Parser; +use crate::cli::Arguments; use crate::evaluator::Evaluator; use crate::lexical_analysis::LexicalAnalysis; use crate::syntax_analysis::SyntaxAnalysis; +mod cli; mod evaluator; mod lexical_analysis; mod syntax_analysis; fn main() { + info!("Version {}.", env!("CARGO_PKG_VERSION")); + let arguments = Arguments::parse(); + debug!("The command line arguments provided are {arguments:?}."); + + // Set up logging: if verbose is true and RUST_LOG is not set, default to info level + if arguments.verbose && std::env::var("RUST_LOG").is_err() { + std::env::set_var("RUST_LOG", "info"); + } + pretty_env_logger::init(); - trace!("Version {}.", env!("CARGO_PKG_VERSION")); let mut evaluator = crate::evaluator::Evaluator::new(); loop {