diff --git a/Cargo.lock b/Cargo.lock index 2e0a74670dd2..0ad45abaf84f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,6 +81,7 @@ dependencies = [ "bytes", "chrono 0.4.19", "clap", + "clap_complete", "ctrlc", "ethers", "ethers-solc", diff --git a/anvil/Cargo.toml b/anvil/Cargo.toml index bbc41c50aed6..0a92022eaef7 100644 --- a/anvil/Cargo.toml +++ b/anvil/Cargo.toml @@ -63,6 +63,7 @@ clap = { version = "3.0.10", features = [ "env", "wrap_help", ], optional = true } +clap_complete = { version = "3.0.4", optional = true } async-trait = "0.1.53" chrono = "0.4.19" auto_impl = "0.5.0" @@ -77,5 +78,5 @@ tokio = { version = "1", features = ["full"] } [features] default = ["cli"] -cmd = ["foundry-common", "forge", "clap", "ctrlc", "anvil-server/clap"] +cmd = ["foundry-common", "forge", "clap", "clap_complete", "ctrlc", "anvil-server/clap"] cli = ["tokio/full", "cmd", "fdlimit"] diff --git a/anvil/src/anvil.rs b/anvil/src/anvil.rs index 23bddbb01626..8205bbbfa1b8 100644 --- a/anvil/src/anvil.rs +++ b/anvil/src/anvil.rs @@ -1,6 +1,6 @@ //! The `anvil` cli use anvil::cmd::NodeArgs; -use clap::Parser; +use clap::{CommandFactory, Parser, Subcommand}; /// A fast local Ethereum development node. #[derive(Debug, Parser)] @@ -8,11 +8,38 @@ use clap::Parser; pub struct App { #[clap(flatten)] pub node: NodeArgs, + + #[clap(subcommand)] + pub cmd: Option, +} + +#[derive(Clone, Debug, Subcommand)] +pub enum Commands { + #[clap(visible_alias = "com", about = "Generate shell completions script.")] + Completions { + #[clap(arg_enum)] + shell: clap_complete::Shell, + }, } #[tokio::main] async fn main() -> Result<(), Box> { let app = App::parse(); + + if let Some(ref cmd) = app.cmd { + match cmd { + Commands::Completions { shell } => { + clap_complete::generate( + *shell, + &mut App::command(), + "anvil", + &mut std::io::stdout(), + ); + } + } + return Ok(()) + } + let _ = fdlimit::raise_fd_limit(); app.node.run().await?;