use serde::{Deserialize, Serialize};
use crate::{AttachSessionSpec, NewSessionSpec, RefreshClientSpec, RmuxEndpoint, SplitSpec};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct CommandRun {
pub stdout: Vec<u8>,
pub stderr: Vec<u8>,
pub exit: Option<i32>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum RmuxCommandKind {
Request(rmux_proto::Request),
NewSession(NewSessionSpec),
AttachSession(AttachSessionSpec),
SplitWindow(SplitSpec),
RefreshClient(RefreshClientSpec),
}
impl RmuxCommandKind {
#[must_use]
pub fn command_name(&self) -> &'static str {
match self {
Self::Request(request) => request.command_name(),
Self::NewSession(_) => "new-session",
Self::AttachSession(_) => "attach-session",
Self::SplitWindow(_) => "split-window",
Self::RefreshClient(_) => "refresh-client",
}
}
#[must_use]
pub fn into_request(self) -> rmux_proto::Request {
self.into()
}
}
impl From<rmux_proto::Request> for RmuxCommandKind {
fn from(value: rmux_proto::Request) -> Self {
Self::Request(value)
}
}
impl From<NewSessionSpec> for RmuxCommandKind {
fn from(value: NewSessionSpec) -> Self {
Self::NewSession(value)
}
}
impl From<AttachSessionSpec> for RmuxCommandKind {
fn from(value: AttachSessionSpec) -> Self {
Self::AttachSession(value)
}
}
impl From<SplitSpec> for RmuxCommandKind {
fn from(value: SplitSpec) -> Self {
Self::SplitWindow(value)
}
}
impl From<RefreshClientSpec> for RmuxCommandKind {
fn from(value: RefreshClientSpec) -> Self {
Self::RefreshClient(value)
}
}
impl From<RmuxCommandKind> for rmux_proto::Request {
fn from(value: RmuxCommandKind) -> Self {
match value {
RmuxCommandKind::Request(request) => request,
RmuxCommandKind::NewSession(spec) => Self::NewSessionExt(spec.into()),
RmuxCommandKind::AttachSession(spec) => Self::AttachSessionExt2(spec.into()),
RmuxCommandKind::SplitWindow(spec) => Self::SplitWindowExt(spec.into()),
RmuxCommandKind::RefreshClient(spec) => Self::RefreshClient(spec.into()),
}
}
}
impl From<NewSessionSpec> for rmux_proto::Request {
fn from(value: NewSessionSpec) -> Self {
RmuxCommandKind::from(value).into()
}
}
impl From<AttachSessionSpec> for rmux_proto::Request {
fn from(value: AttachSessionSpec) -> Self {
RmuxCommandKind::from(value).into()
}
}
impl From<SplitSpec> for rmux_proto::Request {
fn from(value: SplitSpec) -> Self {
RmuxCommandKind::from(value).into()
}
}
impl From<RefreshClientSpec> for rmux_proto::Request {
fn from(value: RefreshClientSpec) -> Self {
RmuxCommandKind::from(value).into()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RmuxCommand {
#[serde(default)]
pub endpoint: RmuxEndpoint,
pub command: RmuxCommandKind,
}
impl RmuxCommand {
#[must_use]
pub fn new(command: impl Into<RmuxCommandKind>) -> Self {
Self {
endpoint: RmuxEndpoint::default(),
command: command.into(),
}
}
#[must_use]
pub fn with_endpoint(endpoint: RmuxEndpoint, command: impl Into<RmuxCommandKind>) -> Self {
Self {
endpoint,
command: command.into(),
}
}
#[must_use]
pub fn command_name(&self) -> &'static str {
self.command.command_name()
}
#[must_use]
pub fn into_request(self) -> rmux_proto::Request {
self.command.into_request()
}
}
impl From<RmuxCommandKind> for RmuxCommand {
fn from(value: RmuxCommandKind) -> Self {
Self::new(value)
}
}
impl From<rmux_proto::Request> for RmuxCommand {
fn from(value: rmux_proto::Request) -> Self {
Self::new(value)
}
}
impl From<NewSessionSpec> for RmuxCommand {
fn from(value: NewSessionSpec) -> Self {
Self::new(value)
}
}
impl From<AttachSessionSpec> for RmuxCommand {
fn from(value: AttachSessionSpec) -> Self {
Self::new(value)
}
}
impl From<SplitSpec> for RmuxCommand {
fn from(value: SplitSpec) -> Self {
Self::new(value)
}
}
impl From<RefreshClientSpec> for RmuxCommand {
fn from(value: RefreshClientSpec) -> Self {
Self::new(value)
}
}
impl From<RmuxCommand> for rmux_proto::Request {
fn from(value: RmuxCommand) -> Self {
value.into_request()
}
}