Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I6a6a6964dcd3beb752ae2d3a90ab6e545815c692
This commit is contained in:
parent
d86d81f3c1
commit
0174e390f3
4 changed files with 71 additions and 1 deletions
11
Cargo.lock
generated
11
Cargo.lock
generated
|
@ -43,6 +43,15 @@ dependencies = [
|
||||||
"clap_lex",
|
"clap_lex",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_complete"
|
||||||
|
version = "4.5.55"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a5abde44486daf70c5be8b8f8f1b66c49f86236edf6fa2abadb4d961c4c6229a"
|
||||||
|
dependencies = [
|
||||||
|
"clap",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_derive"
|
name = "clap_derive"
|
||||||
version = "4.5.41"
|
version = "4.5.41"
|
||||||
|
@ -302,6 +311,8 @@ name = "xtask"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
|
"clap_complete",
|
||||||
|
"eh",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -13,6 +13,7 @@ version = "0.1.1"
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
clap = { default-features = false, features = [ "std", "help", "derive" ], version = "4.5" }
|
clap = { default-features = false, features = [ "std", "help", "derive" ], version = "4.5" }
|
||||||
|
clap_complete = "4.5"
|
||||||
regex = "1.11"
|
regex = "1.11"
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
tracing-subscriber = "0.3"
|
tracing-subscriber = "0.3"
|
||||||
|
|
|
@ -10,3 +10,5 @@ publish = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap.workspace = true
|
clap.workspace = true
|
||||||
|
clap_complete.workspace = true
|
||||||
|
eh = { path = "../eh" }
|
||||||
|
|
|
@ -4,7 +4,8 @@ use std::{
|
||||||
process,
|
process,
|
||||||
};
|
};
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::{CommandFactory, Parser};
|
||||||
|
use clap_complete::{Shell, generate};
|
||||||
|
|
||||||
#[derive(clap::Parser)]
|
#[derive(clap::Parser)]
|
||||||
struct Cli {
|
struct Cli {
|
||||||
|
@ -24,6 +25,15 @@ enum Command {
|
||||||
#[arg(long, default_value = "target/release/eh")]
|
#[arg(long, default_value = "target/release/eh")]
|
||||||
main_binary: PathBuf,
|
main_binary: PathBuf,
|
||||||
},
|
},
|
||||||
|
/// Generate shell completion scripts
|
||||||
|
Completions {
|
||||||
|
/// Shell to generate completions for
|
||||||
|
#[arg(value_enum)]
|
||||||
|
shell: Shell,
|
||||||
|
/// Directory to output completion files
|
||||||
|
#[arg(long, default_value = "completions")]
|
||||||
|
output_dir: PathBuf,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
@ -56,6 +66,12 @@ fn main() {
|
||||||
process::exit(1);
|
process::exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Command::Completions { shell, output_dir } => {
|
||||||
|
if let Err(error) = generate_completions(shell, &output_dir) {
|
||||||
|
eprintln!("error generating completions: {error}");
|
||||||
|
process::exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,3 +133,43 @@ fn create_multicall_binaries(
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn generate_completions(shell: Shell, output_dir: &Path) -> Result<(), Box<dyn error::Error>> {
|
||||||
|
println!("generating {} completions...", shell);
|
||||||
|
|
||||||
|
fs::create_dir_all(output_dir)?;
|
||||||
|
|
||||||
|
let mut cmd = eh::Cli::command();
|
||||||
|
let bin_name = "eh";
|
||||||
|
|
||||||
|
let completion_file = output_dir.join(format!("{}.{}", bin_name, shell));
|
||||||
|
let mut file = fs::File::create(&completion_file)?;
|
||||||
|
|
||||||
|
generate(shell, &mut cmd, bin_name, &mut file);
|
||||||
|
|
||||||
|
println!("completion file generated: {}", completion_file.display());
|
||||||
|
|
||||||
|
// Create symlinks for multicall binaries
|
||||||
|
let multicall_names = ["nb", "nr", "ns"];
|
||||||
|
for name in &multicall_names {
|
||||||
|
let symlink_path = output_dir.join(format!("{}.{}", name, shell));
|
||||||
|
if symlink_path.exists() {
|
||||||
|
fs::remove_file(&symlink_path)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
{
|
||||||
|
std::os::unix::fs::symlink(&completion_file, &symlink_path)?;
|
||||||
|
println!("completion symlink created: {}", symlink_path.display());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
{
|
||||||
|
fs::copy(&completion_file, &symlink_path)?;
|
||||||
|
println!("completion copy created: {}", symlink_path.display());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("completions generated successfully!");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue