You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.5 KiB
56 lines
1.5 KiB
use std::fmt::{Debug, Display}; |
|
use std::path::Path; |
|
|
|
use clap::ValueEnum; |
|
|
|
pub trait Shell: Debug { |
|
fn path(&self, path: &Path) -> anyhow::Result<String>; |
|
fn set_env_var(&self, name: &str, value: &str) -> String; |
|
fn use_on_cd(&self, config: &crate::config::FnmConfig) -> anyhow::Result<String>; |
|
fn rehash(&self) -> Option<String> { |
|
None |
|
} |
|
fn to_clap_shell(&self) -> clap_complete::Shell; |
|
} |
|
|
|
#[derive(Debug, Clone, ValueEnum)] |
|
pub enum Shells { |
|
Bash, |
|
Zsh, |
|
Fish, |
|
PowerShell, |
|
#[cfg(windows)] |
|
Cmd, |
|
} |
|
|
|
impl Display for Shells { |
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
|
match self { |
|
Shells::Bash => write!(f, "bash"), |
|
Shells::Zsh => write!(f, "zsh"), |
|
Shells::Fish => write!(f, "fish"), |
|
Shells::PowerShell => write!(f, "powershell"), |
|
#[cfg(windows)] |
|
Shells::Cmd => write!(f, "cmd"), |
|
} |
|
} |
|
} |
|
|
|
impl From<Shells> for Box<dyn Shell> { |
|
fn from(shell: Shells) -> Box<dyn Shell> { |
|
match shell { |
|
Shells::Zsh => Box::from(super::zsh::Zsh), |
|
Shells::Bash => Box::from(super::bash::Bash), |
|
Shells::Fish => Box::from(super::fish::Fish), |
|
Shells::PowerShell => Box::from(super::powershell::PowerShell), |
|
#[cfg(windows)] |
|
Shells::Cmd => Box::from(super::windows_cmd::WindowsCmd), |
|
} |
|
} |
|
} |
|
|
|
impl From<Box<dyn Shell>> for clap_complete::Shell { |
|
fn from(shell: Box<dyn Shell>) -> Self { |
|
shell.to_clap_shell() |
|
} |
|
}
|
|
|