use clap::{Args, FromArgMatches};
use tokio_util::sync::CancellationToken;
use crate::{component::Component, config::Config, service::IntelliShellService};
pub mod changelog;
pub mod completion_delete;
pub mod completion_list;
pub mod completion_new;
pub mod export;
pub mod fix;
pub mod import;
pub mod new;
pub mod replace;
pub mod search;
#[cfg(feature = "tldr")]
pub mod tldr_clear;
#[cfg(feature = "tldr")]
pub mod tldr_fetch;
#[cfg(feature = "self-update")]
pub mod update;
#[cfg(debug_assertions)]
pub mod query;
#[derive(PartialEq, Eq)]
pub enum ProcessOutput {
Execute { cmd: String },
Output(OutputInfo),
}
#[derive(Clone, PartialEq, Eq, Default)]
#[cfg_attr(test, derive(Debug))]
pub struct OutputInfo {
pub failed: bool,
pub fileout: Option<String>,
pub stdout: Option<String>,
pub stderr: Option<String>,
}
impl ProcessOutput {
pub fn execute(cmd: impl Into<String>) -> Self {
Self::Execute { cmd: cmd.into() }
}
pub fn success() -> Self {
Self::Output(OutputInfo {
failed: false,
..Default::default()
})
}
pub fn fail() -> Self {
Self::Output(OutputInfo {
failed: true,
..Default::default()
})
}
pub fn fileout(self, fileout: impl Into<String>) -> Self {
match self {
e @ ProcessOutput::Execute { .. } => e,
ProcessOutput::Output(data) => ProcessOutput::Output(OutputInfo {
fileout: Some(fileout.into()),
..data
}),
}
}
pub fn stdout(self, stdout: impl Into<String>) -> Self {
match self {
e @ ProcessOutput::Execute { .. } => e,
ProcessOutput::Output(data) => ProcessOutput::Output(OutputInfo {
stdout: Some(stdout.into()),
..data
}),
}
}
pub fn stderr(self, stderr: impl Into<String>) -> Self {
match self {
e @ ProcessOutput::Execute { .. } => e,
ProcessOutput::Output(data) => ProcessOutput::Output(OutputInfo {
stderr: Some(stderr.into()),
..data
}),
}
}
}
#[trait_variant::make(Send)]
pub trait Process {
async fn execute(
self,
config: Config,
service: IntelliShellService,
cancellation_token: CancellationToken,
) -> color_eyre::Result<ProcessOutput>;
}
pub trait InteractiveProcess: Process + FromArgMatches + Args {
fn into_component(
self,
config: Config,
service: IntelliShellService,
inline: bool,
cancellation_token: CancellationToken,
) -> color_eyre::Result<Box<dyn Component>>;
}