mirror of
https://github.com/atuinsh/atuin.git
synced 2024-11-22 16:23:54 +01:00
feat(nushell): add nushell completion generation (#1791)
This commit is contained in:
parent
593dc410eb
commit
5f0e6dd307
2
.github/workflows/release.yaml
vendored
2
.github/workflows/release.yaml
vendored
@ -154,7 +154,7 @@ jobs:
|
|||||||
esac;
|
esac;
|
||||||
|
|
||||||
# Shell completions
|
# Shell completions
|
||||||
for sh in 'bash' 'fish' 'zsh'; do
|
for sh in 'bash' 'fish' 'zsh' 'nushell'; do
|
||||||
$QEMU_PREFIX "${{ steps.strip.outputs.BIN_PATH }}" gen-completions -s $sh -o "${ARCHIVE_DIR}/completions"
|
$QEMU_PREFIX "${{ steps.strip.outputs.BIN_PATH }}" gen-completions -s $sh -o "${ARCHIVE_DIR}/completions"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
11
Cargo.lock
generated
11
Cargo.lock
generated
@ -191,6 +191,7 @@ dependencies = [
|
|||||||
"base64 0.21.7",
|
"base64 0.21.7",
|
||||||
"clap",
|
"clap",
|
||||||
"clap_complete",
|
"clap_complete",
|
||||||
|
"clap_complete_nushell",
|
||||||
"cli-clipboard",
|
"cli-clipboard",
|
||||||
"colored",
|
"colored",
|
||||||
"crossterm",
|
"crossterm",
|
||||||
@ -661,6 +662,16 @@ dependencies = [
|
|||||||
"clap",
|
"clap",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_complete_nushell"
|
||||||
|
version = "4.5.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "80d0e48e026ce7df2040239117d25e4e79714907420c70294a5ce4b6bbe6a7b6"
|
||||||
|
dependencies = [
|
||||||
|
"clap",
|
||||||
|
"clap_complete",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_derive"
|
name = "clap_derive"
|
||||||
version = "4.5.0"
|
version = "4.5.0"
|
||||||
|
@ -29,7 +29,7 @@ time = { version = "0.3", features = [
|
|||||||
"macros",
|
"macros",
|
||||||
"local-offset",
|
"local-offset",
|
||||||
] }
|
] }
|
||||||
clap = { version = "4.0.18", features = ["derive"] }
|
clap = { version = "4.5.1", features = ["derive"] }
|
||||||
config = { version = "0.13", default-features = false, features = ["toml"] }
|
config = { version = "0.13", default-features = false, features = ["toml"] }
|
||||||
directories = "5.0.1"
|
directories = "5.0.1"
|
||||||
eyre = "0.6"
|
eyre = "0.6"
|
||||||
|
@ -63,7 +63,8 @@ async-trait = { workspace = true }
|
|||||||
interim = { workspace = true }
|
interim = { workspace = true }
|
||||||
base64 = { workspace = true }
|
base64 = { workspace = true }
|
||||||
clap = { workspace = true }
|
clap = { workspace = true }
|
||||||
clap_complete = "4.0.3"
|
clap_complete = "4.5.1"
|
||||||
|
clap_complete_nushell = "4.5.1"
|
||||||
fs-err = { workspace = true }
|
fs-err = { workspace = true }
|
||||||
whoami = { workspace = true }
|
whoami = { workspace = true }
|
||||||
rpassword = "7.0"
|
rpassword = "7.0"
|
||||||
|
84
atuin/src/command/gen_completions.rs
Normal file
84
atuin/src/command/gen_completions.rs
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
use clap::{CommandFactory, Parser, ValueEnum};
|
||||||
|
use clap_complete::{generate, generate_to, Generator, Shell};
|
||||||
|
use clap_complete_nushell::Nushell;
|
||||||
|
use eyre::Result;
|
||||||
|
|
||||||
|
// clap put nushell completions into a seperate package due to the maintainers
|
||||||
|
// being a little less commited to support them.
|
||||||
|
// This means we have to do a tiny bit of legwork to combine these completions
|
||||||
|
// into one command.
|
||||||
|
#[derive(Debug, Clone, ValueEnum)]
|
||||||
|
#[value(rename_all = "lower")]
|
||||||
|
pub enum GenShell {
|
||||||
|
Bash,
|
||||||
|
Elvish,
|
||||||
|
Fish,
|
||||||
|
Nushell,
|
||||||
|
PowerShell,
|
||||||
|
Zsh,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Generator for GenShell {
|
||||||
|
fn file_name(&self, name: &str) -> String {
|
||||||
|
match self {
|
||||||
|
// clap_complete
|
||||||
|
Self::Bash => Shell::Bash.file_name(name),
|
||||||
|
Self::Elvish => Shell::Elvish.file_name(name),
|
||||||
|
Self::Fish => Shell::Fish.file_name(name),
|
||||||
|
Self::PowerShell => Shell::PowerShell.file_name(name),
|
||||||
|
Self::Zsh => Shell::Zsh.file_name(name),
|
||||||
|
|
||||||
|
// clap_complete_nushell
|
||||||
|
Self::Nushell => Nushell.file_name(name),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate(&self, cmd: &clap::Command, buf: &mut dyn std::io::prelude::Write) {
|
||||||
|
match self {
|
||||||
|
// clap_complete
|
||||||
|
Self::Bash => Shell::Bash.generate(cmd, buf),
|
||||||
|
Self::Elvish => Shell::Elvish.generate(cmd, buf),
|
||||||
|
Self::Fish => Shell::Fish.generate(cmd, buf),
|
||||||
|
Self::PowerShell => Shell::PowerShell.generate(cmd, buf),
|
||||||
|
Self::Zsh => Shell::Zsh.generate(cmd, buf),
|
||||||
|
|
||||||
|
// clap_complete_nushell
|
||||||
|
Self::Nushell => Nushell.generate(cmd, buf),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Parser)]
|
||||||
|
pub struct Cmd {
|
||||||
|
/// Set the shell for generating completions
|
||||||
|
#[arg(long, short)]
|
||||||
|
shell: GenShell,
|
||||||
|
|
||||||
|
/// Set the output directory
|
||||||
|
#[arg(long, short)]
|
||||||
|
out_dir: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Cmd {
|
||||||
|
pub fn run(self) -> Result<()> {
|
||||||
|
let Cmd { shell, out_dir } = self;
|
||||||
|
|
||||||
|
let mut cli = crate::Atuin::command();
|
||||||
|
|
||||||
|
match out_dir {
|
||||||
|
Some(out_dir) => {
|
||||||
|
generate_to(shell, &mut cli, env!("CARGO_PKG_NAME"), &out_dir)?;
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
generate(
|
||||||
|
shell,
|
||||||
|
&mut cli,
|
||||||
|
env!("CARGO_PKG_NAME"),
|
||||||
|
&mut std::io::stdout(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,4 @@
|
|||||||
use clap::{CommandFactory, Subcommand};
|
use clap::Subcommand;
|
||||||
use clap_complete::{generate, generate_to, Shell};
|
|
||||||
use eyre::Result;
|
use eyre::Result;
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
#[cfg(not(windows))]
|
||||||
@ -13,6 +12,8 @@ mod server;
|
|||||||
|
|
||||||
mod contributors;
|
mod contributors;
|
||||||
|
|
||||||
|
mod gen_completions;
|
||||||
|
|
||||||
#[derive(Subcommand)]
|
#[derive(Subcommand)]
|
||||||
#[command(infer_subcommands = true)]
|
#[command(infer_subcommands = true)]
|
||||||
pub enum AtuinCmd {
|
pub enum AtuinCmd {
|
||||||
@ -31,15 +32,7 @@ pub enum AtuinCmd {
|
|||||||
Contributors,
|
Contributors,
|
||||||
|
|
||||||
/// Generate shell completions
|
/// Generate shell completions
|
||||||
GenCompletions {
|
GenCompletions(gen_completions::Cmd),
|
||||||
/// Set the shell for generating completions
|
|
||||||
#[arg(long, short)]
|
|
||||||
shell: Shell,
|
|
||||||
|
|
||||||
/// Set the output directory
|
|
||||||
#[arg(long, short)]
|
|
||||||
out_dir: Option<String>,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AtuinCmd {
|
impl AtuinCmd {
|
||||||
@ -66,25 +59,7 @@ impl AtuinCmd {
|
|||||||
println!("{}", atuin_common::utils::uuid_v7().as_simple());
|
println!("{}", atuin_common::utils::uuid_v7().as_simple());
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
Self::GenCompletions { shell, out_dir } => {
|
Self::GenCompletions(gen_completions) => gen_completions.run(),
|
||||||
let mut cli = crate::Atuin::command();
|
|
||||||
|
|
||||||
match out_dir {
|
|
||||||
Some(out_dir) => {
|
|
||||||
generate_to(shell, &mut cli, env!("CARGO_PKG_NAME"), &out_dir)?;
|
|
||||||
}
|
|
||||||
None => {
|
|
||||||
generate(
|
|
||||||
shell,
|
|
||||||
&mut cli,
|
|
||||||
env!("CARGO_PKG_NAME"),
|
|
||||||
&mut std::io::stdout(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user