use std::{collections::BTreeMap, path::PathBuf};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::{bindings::Discriminator, client::Client};
use super::Subscription;
#[derive(Serialize, Debug, Clone)]
pub struct Request {
target: Discriminator,
pub content: RequestContent,
id: u32,
}
impl Request {
pub fn new(target: Discriminator, content: RequestContent) -> Self {
Self {
target,
content,
id: Client::reqid(),
}
}
pub fn id(&self) -> u32 {
self.id
}
}
#[derive(Serialize, Clone, PartialEq, Debug)]
#[serde(tag = "type")]
pub enum RequestContent {
#[serde(rename = "confirm recieve")]
ConfirmRecieve {
id: u32,
pass: bool,
},
#[serde(rename = "subscribe")]
Subscribe {
channel: Subscription,
priority: Option<u32>,
component: Option<Discriminator>,
},
#[serde(rename = "Unsubscribe")]
Unsubscribe {
channel: Subscription,
component: Option<Discriminator>,
},
#[serde(rename = "set socket")]
SetSocket { path: PathBuf },
#[serde(rename = "drop")]
Drop { discrim: Option<Discriminator> },
#[serde(rename = "render")]
Render { content: RenderRequest, flush: bool },
#[serde(rename = "spawn")]
Spawn {
command: String,
args: Vec<String>,
env: BTreeMap<String, String>,
label: String,
},
#[serde(rename = "message")]
Message {
content: Value,
sender: Discriminator,
target: Discriminator,
tag: String,
},
#[serde(rename = "new space")]
NewSpace { label: String },
#[serde(rename = "focus at")]
FocusAt,
#[serde(rename = "get state")]
GetState { label: StateValue },
#[serde(rename = "get entry")]
GetEntry { label: String },
#[serde(rename = "remove entry")]
RemoveEntry { label: String },
#[serde(rename = "set entry")]
SetEntry { label: String, value: Value },
#[serde(rename = "watch")]
Watch { label: String },
#[serde(rename = "unwatch")]
Unwatch {
label: String,
watcher: Discriminator,
},
#[serde(rename = "suppress")]
Suppress {
channel: Subscription,
priority: u32,
},
#[serde(rename = "unsuppress")]
Unsuppress { channel: Subscription, id: u32 },
}
#[derive(Serialize, Clone, PartialEq, Eq, Debug)]
#[serde(tag = "type")]
pub enum RenderRequest {
#[serde(rename = "set char")]
SetChar { x: u32, y: u32, c: char },
#[serde(rename = "set colouredchar")]
SetCharColoured {
x: u32,
y: u32,
c: char,
fg: Colour,
bg: Colour,
},
#[serde(rename = "flush")]
Flush,
#[serde(rename = "set cursorstyle")]
SetCursorStyle { style: CursorStyle },
#[serde(rename = "hide cursor")]
HideCursor,
#[serde(rename = "show cursor")]
ShowCursor,
#[serde(rename = "clear all")]
ClearAll,
#[serde(rename = "clear area")]
ClearArea {
x: u32,
y: u32,
width: u32,
height: u32,
},
#[serde(rename = "render multiple")]
RenderMultiple { tasks: Vec<Self> },
}
impl RenderRequest {
pub fn setchar(x: u32, y: u32, c: char) -> Self {
Self::SetChar { x, y, c }
}
pub fn setchar_coloured(x: u32, y: u32, c: char, fg: Colour, bg: Colour) -> Self {
Self::SetCharColoured { x, y, c, fg, bg }
}
pub fn setcursor(style: CursorStyle) -> Self {
Self::SetCursorStyle { style }
}
}
#[derive(Serialize, Clone, Copy, PartialEq, Eq, Debug)]
pub enum CursorStyle {
#[serde(rename = "blinking bar")]
BlinkingBar,
#[serde(rename = "blinking block")]
BlinkingBlock,
#[serde(rename = "blinking underline")]
BlinkingUnderline,
#[serde(rename = "steady bar")]
SteadyBar,
#[serde(rename = "steady block")]
SteadyBlock,
#[serde(rename = "steady underline")]
SteadyUnderline,
}
#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug)]
#[serde(tag = "type")]
pub enum Colour {
#[serde(rename = "black")]
Black,
#[serde(rename = "blue")]
Blue,
#[serde(rename = "cyan")]
Cyan,
#[serde(rename = "green")]
Green,
#[serde(rename = "magenta")]
Magenta,
#[serde(rename = "red")]
Red,
#[serde(rename = "white")]
White,
#[serde(rename = "yellow")]
Yellow,
#[serde(rename = "lightblack")]
LightBlack,
#[serde(rename = "lightblue")]
LightBlue,
#[serde(rename = "lightcyan")]
LightCyan,
#[serde(rename = "lightgreen")]
LightGreen,
#[serde(rename = "lightmagenta")]
LightMagenta,
#[serde(rename = "lightred")]
LightRed,
#[serde(rename = "lightwhite")]
LightWhite,
#[serde(rename = "lightyellow")]
LightYellow,
#[serde(rename = "reset")]
Reset,
#[serde(rename = "ansi")]
Ansi { value: u8 },
#[serde(rename = "rgb")]
Rgb { red: u8, green: u8, blue: u8 },
}
impl Colour {
pub fn ansi(value: u8) -> Self {
Self::Ansi { value }
}
pub fn rgb(r: u8, g: u8, b: u8) -> Self {
Self::Rgb {
red: r,
green: g,
blue: b,
}
}
}
#[derive(Serialize, Clone, PartialEq, Eq, Debug)]
pub enum StateValue {
#[serde(rename = "focused")]
Focused,
#[serde(rename = "is focused")]
IsFocused,
#[serde(rename = "term size")]
TermSize,
#[serde(rename = "working dir")]
WorkingDir,
}