use crate::{DispatcherError, Job, JobId, LogLine, ProcInfo, RestartPolicy};
use clap::{Parser, Subcommand};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
pub struct Cli;
#[derive(Subcommand, Debug, Serialize, Deserialize)]
pub enum ExecCommand {
Run {
args: Vec<String>,
#[arg(short, long, value_name = "POLICY")]
restart: Option<RestartPolicy>,
},
Runat {
at: String,
args: Vec<String>,
},
Start {
service: String,
args: Vec<String>,
#[arg(short, long, value_name = "POLICY")]
restart: Option<RestartPolicy>,
},
Up {
group: String,
},
}
#[derive(Subcommand, Debug, Serialize, Deserialize)]
pub enum CliCommand {
Down {
group: String,
},
Stop {
job_id: JobId,
},
Ps,
Jobs,
Logs {
job_or_service: Option<String>,
},
Exit,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum Message {
Connect,
ExecCommand(ExecCommand, PathBuf),
CliCommand(CliCommand),
PsInfo(Vec<ProcInfo>),
JobInfo(Vec<Job>),
LogLine(LogLine),
Ok,
JobsStarted(Vec<JobId>),
Err(String),
}
impl From<ExecCommand> for Message {
fn from(cmd: ExecCommand) -> Self {
let cwd = std::env::current_dir().unwrap_or(".".into());
Message::ExecCommand(cmd, cwd)
}
}
impl From<CliCommand> for Message {
fn from(cmd: CliCommand) -> Self {
Message::CliCommand(cmd)
}
}
impl From<Result<(), DispatcherError>> for Message {
fn from(res: Result<(), DispatcherError>) -> Self {
if let Err(e) = res {
Message::Err(format!("{e}"))
} else {
Message::Ok
}
}
}