feat: adding oh-my-zsh support

This commit is contained in:
Christopher Valerio 2024-02-17 11:11:55 -06:00
parent 949f16f34a
commit c5faffe946
No known key found for this signature in database
GPG Key ID: 56368034522CF3A9
1 changed files with 49 additions and 42 deletions

View File

@ -1,9 +1,8 @@
use std::{fs::File, io::Write, path::Path};
use std::{fs::File, io::Write}; use crate::cmd::Cmd as MainCmd;
use clap::{Command, Subcommand}; use clap::{Command, Subcommand};
use clap_complete::{generate, Shell}; use clap_complete::{generate, Shell};
use crate::cmd::Cmd as MainCmd;
use std::fs::OpenOptions; use std::fs::OpenOptions;
/// Generates shell completion scripts /// Generates shell completion scripts
@ -17,61 +16,73 @@ pub struct Args {
fn generate_wrapper(shell: Shell, buf: &mut dyn Write) { fn generate_wrapper(shell: Shell, buf: &mut dyn Write) {
let cli = Command::new("aiken").disable_version_flag(true); let cli = Command::new("aiken").disable_version_flag(true);
let mut main = MainCmd::augment_subcommands(cli); let mut main = MainCmd::augment_subcommands(cli);
generate( generate(shell, &mut main, "aiken".to_string(), buf);
shell,
&mut main,
"aiken".to_string(),
buf,
);
} }
fn zsh() -> miette::Result<()> { fn zsh() -> miette::Result<()> {
//if oh-my-zsh //if oh-my-zsh
//if zsh-completions in data_dir
let xdg_dirs = xdg::BaseDirectories::with_prefix("zsh-completions").unwrap();
let data_home = xdg_dirs.get_data_home();
let home = std::env::var("HOME").expect("Cannot find your home directory"); let home = std::env::var("HOME").expect("Cannot find your home directory");
let xdg_dirs = xdg::BaseDirectories::with_prefix("zsh-completions/site-functions").unwrap();
let data_home = xdg_dirs.get_data_home();
let mut completion_file: File; let mut completion_file: File;
let oh_my_zsh_path = Path::new(&home).join(".oh-my-zsh");
if oh_my_zsh_path.exists() {
let completions_path = oh_my_zsh_path.join("completions");
let aiken_completion_path = completions_path.join("_aiken");
if !completions_path.exists() {
std::fs::create_dir(completions_path.as_path()).expect("cannot create directory");
}
completion_file = File::create(aiken_completion_path).expect("cannot open file");
generate_wrapper(Shell::Zsh, &mut completion_file);
return Ok(());
}
if data_home.exists() { if data_home.exists() {
let completion_path = xdg_dirs.place_data_file("_aiken").expect("cannot create directory"); let completion_path = xdg_dirs
.place_data_file("_aiken")
.expect("cannot create directory");
completion_file = File::create(completion_path).expect("cannot open file");
generate_wrapper(Shell::Zsh, &mut completion_file);
return Ok(());
}
let completion_path = xdg_dirs
.place_data_file("_aiken")
.expect("cannot create directory");
completion_file = File::create(completion_path).expect("cannot open file"); completion_file = File::create(completion_path).expect("cannot open file");
} else { let mut zshrc = OpenOptions::new()
.write(true)
let completion_path = xdg_dirs.place_data_file("_aiken").expect("cannot create directory"); .append(true)
completion_file = File::create(completion_path).expect("cannot open file"); .open(format!("{}/.zshrc", home))
.expect(".zshrc file not found");
let mut zshrc = OpenOptions::new().write(true).append(true).open(format!("{}/.zshrc",home)).expect(".zshrc file not found");
if let Some(home) = data_home.to_str() { if let Some(home) = data_home.to_str() {
let fpath: String = format!(r#"fpath=($fpath "{}")"#, home); let fpath: String = format!(r#"fpath=($fpath "{}")"#, home);
if let Err(e) = writeln!(zshrc, "{}", fpath) { if let Err(e) = writeln!(zshrc, "{}", fpath) {
eprintln!("Couldn't write to file: {}", e); eprintln!("Couldn't write to file: {}", e);
} }
}
} }
generate_wrapper(Shell::Zsh, &mut completion_file); generate_wrapper(Shell::Zsh, &mut completion_file);
Ok(()) Ok(())
} }
fn completions_to_file(shell: Shell) -> miette::Result<()> { fn completions_to_file(shell: Shell) -> miette::Result<()> {
match shell { match shell {
Shell::Bash => { Shell::Bash => {
todo!() todo!()
}, }
Shell::Fish => { Shell::Fish => {
todo!() todo!()
}, }
Shell::Zsh => { Shell::Zsh => {
zsh()?; zsh()?;
}, }
_ => eprintln!("Shell not supported"), _ => eprintln!("Shell not supported"),
} }
@ -82,11 +93,7 @@ pub fn exec(cmd_args: Args, shell: Shell) -> miette::Result<()>{
if cmd_args.install { if cmd_args.install {
completions_to_file(shell)?; completions_to_file(shell)?;
} else { } else {
generate_wrapper( generate_wrapper(shell, &mut std::io::stdout());
shell,
&mut std::io::stdout(),
);
} }
Ok(()) Ok(())
} }