use std::fmt;
use serde::{Deserialize, Serialize};
use crate::core::Ready;
pub const EXEC_CONTROL_VERSION: u8 = 1;
pub const EXEC_CONTROL_REQUEST: &str = "control.exec.signal";
pub const EXEC_CONTROL_RESPONSE: &str = "control.exec.signal.result";
#[derive(Clone, Serialize, Deserialize)]
pub struct ExecControlReady {
pub version: u8,
pub endpoint: String,
pub connection: [u8; 16],
}
#[derive(Serialize)]
pub struct ExecControlAdvertisement<'a> {
#[serde(flatten)]
pub ready: &'a Ready,
pub exec_control: &'a ExecControlReady,
}
#[derive(Default, Deserialize)]
pub struct ExecControlDiscovery {
#[serde(default)]
pub exec_control: Option<ExecControlReady>,
}
#[derive(Serialize, Deserialize)]
pub struct ExecControlRequest {
pub version: u8,
pub connection: [u8; 16],
pub id: u32,
pub signal: i32,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ExecControlResponse {
pub delivered: bool,
pub error_code: Option<String>,
pub error: Option<String>,
}
impl ExecControlResponse {
pub fn delivered() -> Self {
Self {
delivered: true,
error_code: None,
error: None,
}
}
pub fn error(code: &str, message: impl Into<String>) -> Self {
Self {
delivered: false,
error_code: Some(code.into()),
error: Some(message.into()),
}
}
}
impl fmt::Debug for ExecControlReady {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("ExecControlReady")
.field("version", &self.version)
.field("endpoint", &self.endpoint)
.field("connection", &"[redacted]")
.finish()
}
}