mirror of
https://github.com/atuinsh/atuin.git
synced 2025-08-17 18:41:37 +02:00
feat: add info for 'official' plugins (#2835)
* feat: add info for 'official' plugins * fix default features
This commit is contained in:
@@ -15,6 +15,7 @@ pub mod import;
|
|||||||
pub mod login;
|
pub mod login;
|
||||||
pub mod logout;
|
pub mod logout;
|
||||||
pub mod ordering;
|
pub mod ordering;
|
||||||
|
pub mod plugin;
|
||||||
pub mod record;
|
pub mod record;
|
||||||
pub mod register;
|
pub mod register;
|
||||||
pub mod secrets;
|
pub mod secrets;
|
||||||
|
97
crates/atuin-client/src/plugin.rs
Normal file
97
crates/atuin-client/src/plugin.rs
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct OfficialPlugin {
|
||||||
|
pub name: String,
|
||||||
|
pub description: String,
|
||||||
|
pub install_message: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl OfficialPlugin {
|
||||||
|
pub fn new(name: &str, description: &str, install_message: &str) -> Self {
|
||||||
|
Self {
|
||||||
|
name: name.to_string(),
|
||||||
|
description: description.to_string(),
|
||||||
|
install_message: install_message.to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct OfficialPluginRegistry {
|
||||||
|
plugins: HashMap<String, OfficialPlugin>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl OfficialPluginRegistry {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
let mut registry = Self {
|
||||||
|
plugins: HashMap::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Register official plugins
|
||||||
|
registry.register_official_plugins();
|
||||||
|
|
||||||
|
registry
|
||||||
|
}
|
||||||
|
|
||||||
|
fn register_official_plugins(&mut self) {
|
||||||
|
// atuin-update plugin
|
||||||
|
self.plugins.insert(
|
||||||
|
"update".to_string(),
|
||||||
|
OfficialPlugin::new(
|
||||||
|
"update",
|
||||||
|
"Update atuin to the latest version",
|
||||||
|
"The 'atuin update' command is provided by the atuin-update plugin.\n\
|
||||||
|
It is only installed if you used the install script\n \
|
||||||
|
If you used a package manager (brew, apt, etc), please continue to use it for updates"
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_plugin(&self, name: &str) -> Option<&OfficialPlugin> {
|
||||||
|
self.plugins.get(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_official_plugin(&self, name: &str) -> bool {
|
||||||
|
self.plugins.contains_key(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_install_message(&self, name: &str) -> Option<&str> {
|
||||||
|
self.plugins
|
||||||
|
.get(name)
|
||||||
|
.map(|plugin| plugin.install_message.as_str())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for OfficialPluginRegistry {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_registry_creation() {
|
||||||
|
let registry = OfficialPluginRegistry::new();
|
||||||
|
assert!(registry.is_official_plugin("update"));
|
||||||
|
assert!(!registry.is_official_plugin("nonexistent"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_plugin() {
|
||||||
|
let registry = OfficialPluginRegistry::new();
|
||||||
|
let plugin = registry.get_plugin("update");
|
||||||
|
assert!(plugin.is_some());
|
||||||
|
assert_eq!(plugin.unwrap().name, "update");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_install_message() {
|
||||||
|
let registry = OfficialPluginRegistry::new();
|
||||||
|
let message = registry.get_install_message("update");
|
||||||
|
assert!(message.is_some());
|
||||||
|
assert!(message.unwrap().contains("atuin-update"));
|
||||||
|
}
|
||||||
|
}
|
@@ -2,6 +2,8 @@ use std::fmt::Write as _;
|
|||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use std::{io, process};
|
use std::{io, process};
|
||||||
|
|
||||||
|
#[cfg(feature = "client")]
|
||||||
|
use atuin_client::plugin::OfficialPluginRegistry;
|
||||||
use clap::CommandFactory;
|
use clap::CommandFactory;
|
||||||
use clap::builder::{StyledStr, Styles};
|
use clap::builder::{StyledStr, Styles};
|
||||||
use eyre::Result;
|
use eyre::Result;
|
||||||
@@ -44,13 +46,31 @@ pub fn run(args: &[String]) -> Result<()> {
|
|||||||
fn render_not_found(subcommand: &str, bin: &str) -> StyledStr {
|
fn render_not_found(subcommand: &str, bin: &str) -> StyledStr {
|
||||||
let mut output = StyledStr::new();
|
let mut output = StyledStr::new();
|
||||||
let styles = Styles::styled();
|
let styles = Styles::styled();
|
||||||
let mut atuin_cmd = Atuin::command();
|
|
||||||
let usage = atuin_cmd.render_usage();
|
|
||||||
|
|
||||||
let error = styles.get_error();
|
let error = styles.get_error();
|
||||||
let invalid = styles.get_invalid();
|
let invalid = styles.get_invalid();
|
||||||
let literal = styles.get_literal();
|
let literal = styles.get_literal();
|
||||||
|
|
||||||
|
#[cfg(feature = "client")]
|
||||||
|
{
|
||||||
|
let registry = OfficialPluginRegistry::new();
|
||||||
|
|
||||||
|
// Check if this is an official plugin
|
||||||
|
if let Some(install_message) = registry.get_install_message(subcommand) {
|
||||||
|
let _ = write!(output, "{error}error:{error:#} ");
|
||||||
|
let _ = write!(
|
||||||
|
output,
|
||||||
|
"'{invalid}{subcommand}{invalid:#}' is an official atuin plugin, but it's not installed"
|
||||||
|
);
|
||||||
|
let _ = write!(output, "\n\n");
|
||||||
|
let _ = write!(output, "{install_message}");
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut atuin_cmd = Atuin::command();
|
||||||
|
let usage = atuin_cmd.render_usage();
|
||||||
|
|
||||||
let _ = write!(output, "{error}error:{error:#} ");
|
let _ = write!(output, "{error}error:{error:#} ");
|
||||||
let _ = write!(
|
let _ = write!(
|
||||||
output,
|
output,
|
||||||
|
Reference in New Issue
Block a user