libccanvas/bindings/request/
request.rs1use std::{collections::BTreeMap, path::PathBuf};
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use crate::{bindings::Discriminator, client::Client};
7
8use super::Subscription;
9
10#[derive(Serialize, Debug, Clone)]
11pub struct Request {
13 target: Discriminator,
15 pub content: RequestContent,
17 id: u32,
19}
20
21impl Request {
22 pub fn new(target: Discriminator, content: RequestContent) -> Self {
24 Self {
25 target,
26 content,
27 id: Client::reqid(),
28 }
29 }
30
31 pub fn id(&self) -> u32 {
33 self.id
34 }
35}
36
37#[derive(Serialize, Clone, PartialEq, Debug)]
38#[serde(tag = "type")]
39pub enum RequestContent {
41 #[serde(rename = "confirm recieve")]
42 ConfirmRecieve {
44 id: u32,
46 pass: bool,
50 },
51
52 #[serde(rename = "subscribe")]
53 Subscribe {
55 channel: Subscription,
56 priority: Option<u32>,
57 component: Option<Discriminator>,
58 },
59
60 #[serde(rename = "Unsubscribe")]
61 Unsubscribe {
63 channel: Subscription,
64 component: Option<Discriminator>,
65 },
66 #[serde(rename = "set socket")]
67 SetSocket { path: PathBuf },
71
72 #[serde(rename = "drop")]
73 Drop { discrim: Option<Discriminator> },
75
76 #[serde(rename = "render")]
77 Render { content: RenderRequest, flush: bool },
79
80 #[serde(rename = "spawn")]
81 Spawn {
83 command: String,
84 args: Vec<String>,
85 env: BTreeMap<String, String>,
86 label: String,
87 },
88
89 #[serde(rename = "message")]
90 Message {
94 content: Value,
95 sender: Discriminator,
96 target: Discriminator,
97 tag: String,
98 },
99
100 #[serde(rename = "new space")]
102 NewSpace { label: String },
103
104 #[serde(rename = "focus at")]
106 FocusAt,
107
108 #[serde(rename = "get state")]
113 GetState { label: StateValue },
114
115 #[serde(rename = "get entry")]
117 GetEntry { label: String },
118
119 #[serde(rename = "remove entry")]
121 RemoveEntry { label: String },
122
123 #[serde(rename = "set entry")]
125 SetEntry { label: String, value: Value },
126
127 #[serde(rename = "watch")]
129 Watch { label: String },
130
131 #[serde(rename = "unwatch")]
133 Unwatch {
134 label: String,
135 watcher: Discriminator,
136 },
137
138 #[serde(rename = "suppress")]
140 Suppress {
141 channel: Subscription,
142 priority: u32,
143 },
144
145 #[serde(rename = "unsuppress")]
147 Unsuppress { channel: Subscription, id: u32 },
148}
149
150#[derive(Serialize, Clone, PartialEq, Eq, Debug)]
151#[serde(tag = "type")]
152pub enum RenderRequest {
154 #[serde(rename = "set char")]
156 SetChar { x: u32, y: u32, c: char },
157 #[serde(rename = "set colouredchar")]
159 SetCharColoured {
160 x: u32,
161 y: u32,
162 c: char,
163 fg: Colour,
164 bg: Colour,
165 },
166 #[serde(rename = "flush")]
168 Flush,
169 #[serde(rename = "set cursorstyle")]
171 SetCursorStyle { style: CursorStyle },
172 #[serde(rename = "hide cursor")]
174 HideCursor,
175 #[serde(rename = "show cursor")]
177 ShowCursor,
178 #[serde(rename = "clear all")]
180 ClearAll,
181
182 #[serde(rename = "clear area")]
184 ClearArea {
185 x: u32,
186 y: u32,
187 width: u32,
188 height: u32,
189 },
190
191 #[serde(rename = "render multiple")]
194 RenderMultiple { tasks: Vec<Self> },
195}
196
197impl RenderRequest {
198 pub fn setchar(x: u32, y: u32, c: char) -> Self {
200 Self::SetChar { x, y, c }
201 }
202
203 pub fn setchar_coloured(x: u32, y: u32, c: char, fg: Colour, bg: Colour) -> Self {
205 Self::SetCharColoured { x, y, c, fg, bg }
206 }
207
208 pub fn setcursor(style: CursorStyle) -> Self {
210 Self::SetCursorStyle { style }
211 }
212}
213
214#[derive(Serialize, Clone, Copy, PartialEq, Eq, Debug)]
215pub enum CursorStyle {
217 #[serde(rename = "blinking bar")]
218 BlinkingBar,
219 #[serde(rename = "blinking block")]
220 BlinkingBlock,
221 #[serde(rename = "blinking underline")]
222 BlinkingUnderline,
223 #[serde(rename = "steady bar")]
224 SteadyBar,
225 #[serde(rename = "steady block")]
226 SteadyBlock,
227 #[serde(rename = "steady underline")]
228 SteadyUnderline,
229}
230
231#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug)]
232#[serde(tag = "type")]
233pub enum Colour {
235 #[serde(rename = "black")]
236 Black,
237 #[serde(rename = "blue")]
238 Blue,
239 #[serde(rename = "cyan")]
240 Cyan,
241 #[serde(rename = "green")]
242 Green,
243 #[serde(rename = "magenta")]
244 Magenta,
245 #[serde(rename = "red")]
246 Red,
247 #[serde(rename = "white")]
248 White,
249 #[serde(rename = "yellow")]
250 Yellow,
251
252 #[serde(rename = "lightblack")]
253 LightBlack,
254 #[serde(rename = "lightblue")]
255 LightBlue,
256 #[serde(rename = "lightcyan")]
257 LightCyan,
258 #[serde(rename = "lightgreen")]
259 LightGreen,
260 #[serde(rename = "lightmagenta")]
261 LightMagenta,
262 #[serde(rename = "lightred")]
263 LightRed,
264 #[serde(rename = "lightwhite")]
265 LightWhite,
266 #[serde(rename = "lightyellow")]
267 LightYellow,
268
269 #[serde(rename = "reset")]
270 Reset,
271 #[serde(rename = "ansi")]
272 Ansi { value: u8 },
273 #[serde(rename = "rgb")]
274 Rgb { red: u8, green: u8, blue: u8 },
275}
276
277impl Colour {
278 pub fn ansi(value: u8) -> Self {
280 Self::Ansi { value }
281 }
282
283 pub fn rgb(r: u8, g: u8, b: u8) -> Self {
285 Self::Rgb {
286 red: r,
287 green: g,
288 blue: b,
289 }
290 }
291}
292
293#[derive(Serialize, Clone, PartialEq, Eq, Debug)]
295pub enum StateValue {
296 #[serde(rename = "focused")]
297 Focused,
298 #[serde(rename = "is focused")]
299 IsFocused,
300 #[serde(rename = "term size")]
301 TermSize,
302 #[serde(rename = "working dir")]
303 WorkingDir,
304}