81 lines
2.1 KiB
Rust
81 lines
2.1 KiB
Rust
use std::fmt;
|
|
|
|
use serde::{
|
|
de::{self, Deserializer, Visitor},
|
|
Deserialize, Serialize,
|
|
};
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub enum Action {
|
|
/// Apply any pending update to the screen
|
|
Render,
|
|
/// Notify there is a pending update
|
|
ShouldRender,
|
|
Resize(u16, u16),
|
|
Suspend,
|
|
Resume,
|
|
Quit,
|
|
Refresh,
|
|
Error(String),
|
|
PreviousBuffer,
|
|
NextBuffer,
|
|
ToBuffer(isize),
|
|
RunCommand(String),
|
|
MouseEvent(crossterm::event::MouseEvent),
|
|
Help,
|
|
}
|
|
|
|
/*
|
|
impl<'de> Deserialize<'de> for Action {
|
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
where
|
|
D: Deserializer<'de>,
|
|
{
|
|
struct ActionVisitor;
|
|
|
|
impl<'de> Visitor<'de> for ActionVisitor {
|
|
type Value = Action;
|
|
|
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
formatter.write_str("a valid string representation of Action")
|
|
}
|
|
|
|
fn visit_str<E>(self, value: &str) -> Result<Action, E>
|
|
where
|
|
E: de::Error,
|
|
{
|
|
match value {
|
|
"Render" => Ok(Action::Render),
|
|
"Suspend" => Ok(Action::Suspend),
|
|
"Resume" => Ok(Action::Resume),
|
|
"Quit" => Ok(Action::Quit),
|
|
"Refresh" => Ok(Action::Refresh),
|
|
"Help" => Ok(Action::Help),
|
|
data if data.starts_with("Error(") => {
|
|
let error_msg = data.trim_start_matches("Error(").trim_end_matches(")");
|
|
Ok(Action::Error(error_msg.to_string()))
|
|
},
|
|
data if data.starts_with("Resize(") => {
|
|
let parts: Vec<&str> = data
|
|
.trim_start_matches("Resize(")
|
|
.trim_end_matches(")")
|
|
.split(',')
|
|
.collect();
|
|
if parts.len() == 2 {
|
|
let width: u16 = parts[0].trim().parse().map_err(E::custom)?;
|
|
let height: u16 = parts[1].trim().parse().map_err(E::custom)?;
|
|
Ok(Action::Resize(width, height))
|
|
} else {
|
|
Err(E::custom(format!("Invalid Resize format: {}", value)))
|
|
}
|
|
},
|
|
_ => Err(E::custom(format!("Unknown Action variant: {}", value))),
|
|
}
|
|
}
|
|
}
|
|
|
|
deserializer.deserialize_str(ActionVisitor)
|
|
}
|
|
}
|
|
*/
|