Refactor(Events): Changed the `Event` type from a struct to an enum
This commit is contained in:
parent
dd3c765ea2
commit
dfeac4662d
|
@ -1,7 +1,7 @@
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
|
|
||||||
use super::events::event_types::{Event, EventBuilder};
|
use super::events::event_types::Event;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum Command {
|
pub enum Command {
|
||||||
|
@ -19,7 +19,7 @@ pub enum Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn execute(channel: &mpsc::Sender<Event>, command: Command) -> Result<()> {
|
pub async fn execute(channel: &mpsc::Sender<Event>, command: Command) -> Result<()> {
|
||||||
let event = EventBuilder::default().command_event(command).build();
|
let event = Event::CommandEvent(command);
|
||||||
channel.send(event).await?;
|
channel.send(event).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,39 +10,32 @@ use self::handlers::{command, main, matrix, setup};
|
||||||
use super::EventStatus;
|
use super::EventStatus;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Event {
|
pub enum Event {
|
||||||
pub(super) input_event: Option<CrosstermEvent>,
|
InputEvent(CrosstermEvent),
|
||||||
pub(super) matrix_event: Option<matrix_sdk::deserialized_responses::SyncResponse>,
|
MatrixEvent(matrix_sdk::deserialized_responses::SyncResponse),
|
||||||
pub(super) command_event: Option<Command>,
|
CommandEvent(Command),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Event {
|
impl Event {
|
||||||
pub async fn handle(&self, app: &mut App<'_>) -> Result<EventStatus> {
|
pub async fn handle(&self, app: &mut App<'_>) -> Result<EventStatus> {
|
||||||
if let Some(matrix_event) = &self.matrix_event {
|
match &self {
|
||||||
return matrix::handle(app, matrix_event)
|
Event::MatrixEvent(event) => matrix::handle(app, event)
|
||||||
.await
|
.await
|
||||||
.with_context(|| format!("Failed to handle matrix event: `{:#?}`", matrix_event));
|
.with_context(|| format!("Failed to handle matrix event: `{:#?}`", event)),
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(command_event) = &self.command_event {
|
Event::CommandEvent(event) => command::handle(app, event)
|
||||||
return command::handle(app, command_event).await.with_context(|| {
|
.await
|
||||||
format!("Failed to handle command event: `{:#?}`", command_event)
|
.with_context(|| format!("Failed to handle command event: `{:#?}`", event)),
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(input_event) = &self.input_event {
|
Event::InputEvent(event) => match app.status.state() {
|
||||||
let status = match app.status.state() {
|
State::None => Ok(EventStatus::Ok),
|
||||||
State::None => EventStatus::Ok,
|
State::Main => main::handle(app, event)
|
||||||
State::Main => main::handle(app, input_event).await.with_context(|| {
|
.await
|
||||||
format!("Failed to handle input event: `{:#?}`", input_event)
|
.with_context(|| format!("Failed to handle input event: `{:#?}`", event)),
|
||||||
})?,
|
State::Setup => setup::handle(app, event)
|
||||||
State::Setup => setup::handle(app, input_event).await.with_context(|| {
|
.await
|
||||||
format!("Failed to handle input event: `{:#?}`", input_event)
|
.with_context(|| format!("Failed to handle input event: `{:#?}`", event)),
|
||||||
})?,
|
},
|
||||||
};
|
}
|
||||||
return Ok(status);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(EventStatus::Ok)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
use super::Event;
|
|
||||||
|
|
||||||
pub struct EventBuilder {
|
|
||||||
event: Event,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Event {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
input_event: None,
|
|
||||||
matrix_event: None,
|
|
||||||
command_event: None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for EventBuilder {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
event: Event::default(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl EventBuilder {
|
|
||||||
pub fn input_event(&mut self, input_event: crossterm::event::Event) -> &Self {
|
|
||||||
self.event.input_event = Some(input_event);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn matrix_event(
|
|
||||||
&mut self,
|
|
||||||
matrix_event: matrix_sdk::deserialized_responses::SyncResponse,
|
|
||||||
) -> &Self {
|
|
||||||
self.event.matrix_event = Some(matrix_event);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn command_event(&mut self, command_event: crate::app::command::Command) -> &Self {
|
|
||||||
self.event.command_event = Some(command_event);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn build(&self) -> Event {
|
|
||||||
Event {
|
|
||||||
input_event: self.event.input_event.to_owned(),
|
|
||||||
matrix_event: self.event.matrix_event.to_owned(),
|
|
||||||
command_event: self.event.command_event.to_owned(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +1,5 @@
|
||||||
pub mod event_builder;
|
|
||||||
pub mod event;
|
pub mod event;
|
||||||
pub mod event_status;
|
pub mod event_status;
|
||||||
|
|
||||||
pub use self::event_builder::*;
|
|
||||||
pub use self::event::*;
|
pub use self::event::*;
|
||||||
pub use self::event_status::*;
|
pub use self::event_status::*;
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,6 @@ use matrix_sdk::{config::SyncSettings, Client, LoopCtrl};
|
||||||
use tokio::{sync::mpsc, time::Duration};
|
use tokio::{sync::mpsc, time::Duration};
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
|
|
||||||
use crate::app::events::event_types::EventBuilder;
|
|
||||||
|
|
||||||
use self::event_types::Event;
|
use self::event_types::Event;
|
||||||
|
|
||||||
pub async fn poll_input_events(
|
pub async fn poll_input_events(
|
||||||
|
@ -16,10 +14,7 @@ pub async fn poll_input_events(
|
||||||
async fn poll_input_events_stage_2(channel: mpsc::Sender<Event>) -> Result<()> {
|
async fn poll_input_events_stage_2(channel: mpsc::Sender<Event>) -> Result<()> {
|
||||||
loop {
|
loop {
|
||||||
if crossterm::event::poll(Duration::from_millis(100))? {
|
if crossterm::event::poll(Duration::from_millis(100))? {
|
||||||
let event = EventBuilder::default()
|
let event = Event::InputEvent(crossterm::event::read()?);
|
||||||
.input_event(crossterm::event::read()?)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
channel.send(event).await?;
|
channel.send(event).await?;
|
||||||
} else {
|
} else {
|
||||||
tokio::task::yield_now().await;
|
tokio::task::yield_now().await;
|
||||||
|
@ -49,7 +44,7 @@ pub async fn poll_matrix_events(
|
||||||
|
|
||||||
client
|
client
|
||||||
.sync_with_callback(sync_settings, |response| async move {
|
.sync_with_callback(sync_settings, |response| async move {
|
||||||
let event = EventBuilder::default().matrix_event(response).build();
|
let event = Event::MatrixEvent(response);
|
||||||
|
|
||||||
match tx.send(event).await {
|
match tx.send(event).await {
|
||||||
Ok(_) => LoopCtrl::Continue,
|
Ok(_) => LoopCtrl::Continue,
|
||||||
|
|
|
@ -14,10 +14,9 @@ use status::{State, Status};
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
|
|
||||||
use crate::app::command::Command;
|
|
||||||
use crate::{accounts, app::command_interface::generate_ci_functions, ui};
|
use crate::{accounts, app::command_interface::generate_ci_functions, ui};
|
||||||
|
|
||||||
use self::events::event_types::{self, Event, EventBuilder};
|
use self::events::event_types::{self, Event};
|
||||||
|
|
||||||
pub struct App<'ui> {
|
pub struct App<'ui> {
|
||||||
ui: ui::UI<'ui>,
|
ui: ui::UI<'ui>,
|
||||||
|
|
Reference in New Issue