1use crate::{DispatcherError, Job, JobId, LogLine, ProcInfo};
2use clap::{Parser, Subcommand};
3use serde::{Deserialize, Serialize};
4
5#[derive(Parser, Debug)]
6#[command(version, about, long_about = None)]
7pub struct Cli;
8
9#[derive(Subcommand, Debug, Serialize, Deserialize)]
11pub enum ExecCommand {
12 Run {
14 args: Vec<String>,
16 },
17 Runat {
19 at: String,
21 args: Vec<String>,
23 },
24 Start {
26 service: String,
28 },
29 Up {
31 group: String,
33 },
34}
35
36#[derive(Subcommand, Debug, Serialize, Deserialize)]
38pub enum CliCommand {
39 Down {
41 group: String,
43 },
44 Stop {
46 job_id: JobId,
48 },
49 Ps,
51 Jobs,
53 Logs {
55 job_or_service: Option<String>,
57 },
59 Exit,
61}
62
63#[derive(Debug, Serialize, Deserialize)]
65pub enum Message {
66 Connect,
68 ExecCommand(ExecCommand),
70 CliCommand(CliCommand),
71 PsInfo(Vec<ProcInfo>),
73 JobInfo(Vec<Job>),
74 LogLine(LogLine),
75 Ok,
76 JobsStarted(Vec<JobId>),
77 Err(String),
78}
79
80impl From<ExecCommand> for Message {
81 fn from(cmd: ExecCommand) -> Self {
82 Message::ExecCommand(cmd)
83 }
84}
85
86impl From<CliCommand> for Message {
87 fn from(cmd: CliCommand) -> Self {
88 Message::CliCommand(cmd)
89 }
90}
91
92impl From<Result<(), DispatcherError>> for Message {
94 fn from(res: Result<(), DispatcherError>) -> Self {
95 if let Err(e) = res {
96 Message::Err(format!("{e}"))
97 } else {
98 Message::Ok
99 }
100 }
101}