use serde::{Deserialize, Serialize};
use crate::bindings::Colour;
#[derive(Serialize, Debug)]
#[serde(tag = "type")]
pub enum ScrollPosition {
#[serde(rename = "absolute")]
Absolute { index: u32 },
#[serde(rename = "relative")]
Relative { index: i32 },
}
impl ScrollPosition {
pub fn absolute(index: u32) -> Self {
Self::Absolute { index }
}
pub fn relative(index: i32) -> Self {
Self::Relative { index }
}
}
#[derive(Serialize, Clone, Debug)]
#[serde(tag = "type")]
pub enum Chunk {
#[serde(rename = "colour")]
Colour { value: Colour },
#[serde(rename = "text")]
Text { value: String },
}
impl Chunk {
pub fn colour(colour: Colour) -> Self {
Self::Colour { value: colour }
}
pub fn text(text: String) -> Self {
Self::Text { value: text }
}
}
#[derive(Default, Serialize, Debug)]
pub struct Entry(pub Vec<Chunk>);
impl From<Vec<Chunk>> for Entry {
fn from(value: Vec<Chunk>) -> Self {
Self(value)
}
}
impl From<String> for Entry {
fn from(value: String) -> Self {
Self(vec![Chunk::text(value)])
}
}
impl From<&str> for Entry {
fn from(value: &str) -> Self {
value.to_string().into()
}
}
impl Entry {
pub fn push(&mut self, new: Chunk) {
self.0.push(new)
}
pub fn append(&mut self, other: &mut Self) {
self.0.append(&mut other.0)
}
pub fn join(mut self, mut other: Self) -> Self {
self.append(&mut other);
self
}
}
#[derive(Serialize, Debug)]
pub struct ScrollRequest {
#[serde(flatten)]
pub content: ScrollRequestVariant,
pub id: u32,
}
#[derive(Serialize, Debug)]
#[serde(tag = "type", content = "content")]
pub enum ScrollRequestVariant {
#[serde(rename = "add")]
AddEntry {
#[serde(flatten)]
position: ScrollPosition,
entry: Entry,
},
#[serde(rename = "remove")]
RemoveEntry { uid: u32 },
#[serde(rename = "update")]
UpdateEntry { uid: u32, new: Entry },
#[serde(rename = "multiple")]
Multiple { requests: Vec<ScrollRequest> },
}
#[derive(Deserialize, Debug)]
pub struct ScrollResponse {
#[serde(flatten)]
pub content: ScrollResponseVariant,
pub id: u32,
}
impl ScrollRequest {
pub fn new(id: u32, content: ScrollRequestVariant) -> Self {
Self { content, id }
}
}
#[derive(Deserialize, Debug)]
#[serde(tag = "type")]
pub enum ScrollResponseVariant {
#[serde(rename = "created")]
Created { uid: u32 },
#[serde(rename = "updated")]
Updated,
#[serde(rename = "removed")]
Removed,
#[serde(rename = "not found")]
NotFound,
#[serde(rename = "recieved")]
Recieved,
#[serde(rename = "multiple")]
Multiple { responses: Vec<Self> },
}
impl ScrollResponseVariant {
pub fn as_created(&self) -> Option<u32> {
if let Self::Created { uid } = self {
Some(*uid)
} else {
None
}
}
pub fn as_multiple(&self) -> Option<&[Self]> {
if let Self::Multiple { responses } = self {
Some(responses)
} else {
None
}
}
}