Files
keep/src/meta_plugin.rs
Andrew Phillips 8a2468522a feat: add tty meta plugin to get current terminal device
Co-authored-by: aider (openai/andrew.openrouter.qwen.qwen3-coder) <aider@aider.chat>
2025-07-29 14:38:09 -03:00

83 lines
3.1 KiB
Rust

use anyhow::Result;
use std::io;
use std::io::Write;
pub mod program;
pub mod digest;
pub mod system;
use crate::meta_plugin::program::MetaPluginProgram;
use crate::meta_plugin::digest::{DigestSha256MetaPlugin, ReadTimeMetaPlugin, ReadRateMetaPlugin};
use crate::meta_plugin::system::{CwdMetaPlugin, UidMetaPlugin, UserMetaPlugin, GidMetaPlugin, GroupMetaPlugin, ShellMetaPlugin, ShellPidMetaPlugin, KeepPidMetaPlugin, HostnameMetaPlugin, FullHostnameMetaPlugin};
#[derive(Debug, Eq, PartialEq, Clone, strum::EnumIter, strum::Display, strum::EnumString)]
#[strum(ascii_case_insensitive)]
pub enum MetaPluginType {
FileMagic,
FileMime,
FileEncoding,
LineCount,
WordCount,
Cwd,
Uid,
User,
Gid,
Group,
Shell,
ShellPid,
KeepPid,
DigestSha256,
DigestMd5,
ReadTime,
ReadRate,
Hostname,
FullHostname,
Tty,
}
pub trait MetaPlugin {
fn is_supported(&self) -> bool {
true
}
fn create(&self) -> Result<Box<dyn Write>>;
fn finalize(&mut self) -> io::Result<String>;
// Update the meta plugin with new data
fn update(&mut self, data: &[u8]);
fn meta_name(&mut self) -> String;
// Get program information for display in status
fn program_info(&self) -> Option<(&str, Vec<&str>)> {
None
}
}
pub fn get_meta_plugin(meta_plugin_type: MetaPluginType) -> Box<dyn MetaPlugin> {
match meta_plugin_type {
MetaPluginType::FileMagic => Box::new(MetaPluginProgram::new("file", vec!["-bE", "-"], "file_magic".to_string(), true)),
MetaPluginType::FileMime => Box::new(MetaPluginProgram::new("file", vec!["-b", "--mime-type", "-"], "file_mime".to_string(), true)),
MetaPluginType::FileEncoding => Box::new(MetaPluginProgram::new("file", vec!["-b", "--mime-encoding", "-"], "file_encoding".to_string(), true)),
MetaPluginType::LineCount => Box::new(MetaPluginProgram::new("wc", vec!["-l"], "line_count".to_string(), true)),
MetaPluginType::WordCount => Box::new(MetaPluginProgram::new("wc", vec!["-w"], "word_count".to_string(), true)),
MetaPluginType::Cwd => Box::new(CwdMetaPlugin::new()),
MetaPluginType::Uid => Box::new(UidMetaPlugin::new()),
MetaPluginType::User => Box::new(UserMetaPlugin::new()),
MetaPluginType::Gid => Box::new(GidMetaPlugin::new()),
MetaPluginType::Group => Box::new(GroupMetaPlugin::new()),
MetaPluginType::Shell => Box::new(ShellMetaPlugin::new()),
MetaPluginType::ShellPid => Box::new(ShellPidMetaPlugin::new()),
MetaPluginType::KeepPid => Box::new(KeepPidMetaPlugin::new()),
MetaPluginType::DigestSha256 => Box::new(DigestSha256MetaPlugin::new()),
MetaPluginType::DigestMd5 => Box::new(MetaPluginProgram::new("md5sum", vec![], "digest_md5".to_string(), true)),
MetaPluginType::ReadTime => Box::new(ReadTimeMetaPlugin::new()),
MetaPluginType::ReadRate => Box::new(ReadRateMetaPlugin::new()),
MetaPluginType::Hostname => Box::new(HostnameMetaPlugin::new()),
MetaPluginType::FullHostname => Box::new(FullHostnameMetaPlugin::new()),
MetaPluginType::Tty => Box::new(TtyMetaPlugin::new()),
}
}