From 47125d97b1779c5074916549f609c3ac163d6115 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Tue, 13 May 2025 13:47:52 -0400 Subject: [PATCH] implemented support for running scripts --- Cargo.lock | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/fern.rs | 49 +++++++++++++++++++++- 3 files changed, 164 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index b8c9a31..ee5739c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,56 @@ dependencies = [ "memchr", ] +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + [[package]] name = "bitflags" version = "2.8.0" @@ -29,6 +79,46 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "clap" +version = "4.5.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed93b9805f8ba930df42c2590f05453d5ec36cbb85d018868a5b24d31f6ac000" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + [[package]] name = "clipboard-win" version = "5.4.0" @@ -38,6 +128,12 @@ dependencies = [ "error-code", ] +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + [[package]] name = "console" version = "0.15.11" @@ -100,6 +196,7 @@ name = "fern" version = "0.1.0" dependencies = [ "bitflags", + "clap", "glob", "insta", "nix", @@ -114,6 +211,12 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "home" version = "0.5.11" @@ -136,6 +239,12 @@ dependencies = [ "similar", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "libc" version = "0.2.169" @@ -339,6 +448,12 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +[[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.98" diff --git a/Cargo.toml b/Cargo.toml index 8fbc34a..b4b899b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ debug = true [dependencies] bitflags = "2.8.0" +clap = { version = "4.5.38", features = ["derive"] } glob = "0.3.2" insta = "1.42.2" nix = { version = "0.29.0", features = ["uio", "term", "user", "hostname", "fs", "default", "signal", "process", "event", "ioctl"] } diff --git a/src/fern.rs b/src/fern.rs index 8d11220..9529693 100644 --- a/src/fern.rs +++ b/src/fern.rs @@ -23,10 +23,58 @@ use crate::parse::execute::exec_input; use crate::signal::sig_setup; use crate::state::source_rc; use crate::prelude::*; +use clap::Parser; +use state::write_vars; +#[derive(Parser,Debug)] +struct FernArgs { + script: Option, + + #[arg(trailing_var_arg = true)] + script_args: Vec, + + #[arg(long)] + version: bool +} fn main() { + let args = FernArgs::parse(); + if args.version { + println!("fern {}", env!("CARGO_PKG_VERSION")); + return; + } + + if let Some(path) = args.script { + run_script(path, args.script_args); + } else { + fern_interactive(); + } +} + +fn run_script>(path: P, args: Vec) { + let path = path.as_ref(); + if !path.is_file() { + eprintln!("fern: Failed to open input file: {}", path.display()); + exit(1); + } + let Ok(input) = fs::read_to_string(path) else { + eprintln!("fern: Failed to read input file: {}", path.display()); + exit(1); + }; + + write_vars(|v| v.bpush_arg(path.to_string_lossy().to_string())); + for arg in args { + write_vars(|v| v.bpush_arg(arg)) + } + + if let Err(e) = exec_input(input) { + eprintln!("{e}"); + exit(1); + } +} + +fn fern_interactive() { save_termios(); set_termios(); sig_setup(); @@ -59,5 +107,4 @@ fn main() { eprintln!("{e}"); } } - exit(1); }