2024-05-12 21:07:21 +02:00
|
|
|
use hyperlog_core::log::ItemState;
|
2024-04-29 21:48:01 +02:00
|
|
|
use serde::Serialize;
|
|
|
|
|
2024-05-11 23:23:00 +02:00
|
|
|
use crate::{events::Events, shared_engine::SharedEngine, storage::Storage};
|
2024-04-29 21:48:01 +02:00
|
|
|
|
|
|
|
#[derive(Serialize, PartialEq, Eq, Debug, Clone)]
|
|
|
|
pub enum Command {
|
|
|
|
CreateRoot {
|
|
|
|
root: String,
|
|
|
|
},
|
|
|
|
CreateSection {
|
|
|
|
root: String,
|
|
|
|
path: Vec<String>,
|
|
|
|
},
|
|
|
|
CreateItem {
|
|
|
|
root: String,
|
|
|
|
path: Vec<String>,
|
|
|
|
title: String,
|
|
|
|
description: String,
|
|
|
|
state: ItemState,
|
|
|
|
},
|
2024-05-10 12:03:38 +02:00
|
|
|
UpdateItem {
|
|
|
|
root: String,
|
|
|
|
path: Vec<String>,
|
|
|
|
title: String,
|
|
|
|
description: String,
|
|
|
|
state: ItemState,
|
|
|
|
},
|
2024-05-09 17:02:06 +02:00
|
|
|
ToggleItem {
|
|
|
|
root: String,
|
|
|
|
path: Vec<String>,
|
|
|
|
},
|
2024-04-29 21:48:01 +02:00
|
|
|
Move {
|
|
|
|
root: String,
|
|
|
|
src: Vec<String>,
|
|
|
|
dest: Vec<String>,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2024-05-12 21:07:21 +02:00
|
|
|
#[derive(Clone)]
|
|
|
|
enum CommanderVariant {
|
|
|
|
Local(local::Commander),
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
2024-04-29 21:48:01 +02:00
|
|
|
pub struct Commander {
|
2024-05-12 21:07:21 +02:00
|
|
|
variant: CommanderVariant,
|
2024-04-29 21:48:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Commander {
|
2024-05-12 21:07:21 +02:00
|
|
|
pub fn local(engine: SharedEngine, storage: Storage, events: Events) -> anyhow::Result<Self> {
|
2024-04-29 23:34:04 +02:00
|
|
|
Ok(Self {
|
2024-05-12 21:07:21 +02:00
|
|
|
variant: CommanderVariant::Local(local::Commander::new(engine, storage, events)?),
|
2024-04-29 23:34:04 +02:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2024-05-12 21:07:21 +02:00
|
|
|
pub async fn execute(&self, cmd: Command) -> anyhow::Result<()> {
|
|
|
|
match &self.variant {
|
|
|
|
CommanderVariant::Local(commander) => commander.execute(cmd),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-04-29 21:48:01 +02:00
|
|
|
|
2024-05-12 21:07:21 +02:00
|
|
|
mod local {
|
|
|
|
use std::collections::BTreeMap;
|
|
|
|
|
|
|
|
use hyperlog_core::log::GraphItem;
|
|
|
|
|
|
|
|
use crate::{events::Events, shared_engine::SharedEngine, storage::Storage};
|
|
|
|
|
|
|
|
use super::Command;
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct Commander {
|
|
|
|
engine: SharedEngine,
|
|
|
|
storage: Storage,
|
|
|
|
events: Events,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Commander {
|
|
|
|
pub fn new(engine: SharedEngine, storage: Storage, events: Events) -> anyhow::Result<Self> {
|
|
|
|
Ok(Self {
|
|
|
|
engine,
|
|
|
|
storage,
|
|
|
|
events,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn execute(&self, cmd: Command) -> anyhow::Result<()> {
|
|
|
|
tracing::debug!("executing event: {}", serde_json::to_string(&cmd)?);
|
|
|
|
|
|
|
|
match cmd.clone() {
|
|
|
|
Command::CreateRoot { root } => {
|
|
|
|
self.engine.create_root(&root)?;
|
|
|
|
}
|
|
|
|
Command::CreateSection { root, path } => {
|
|
|
|
self.engine.create(
|
|
|
|
&root,
|
|
|
|
&path.iter().map(|p| p.as_str()).collect::<Vec<_>>(),
|
|
|
|
GraphItem::Section(BTreeMap::default()),
|
|
|
|
)?;
|
|
|
|
}
|
|
|
|
Command::CreateItem {
|
|
|
|
root,
|
|
|
|
path,
|
2024-04-29 21:48:01 +02:00
|
|
|
title,
|
|
|
|
description,
|
|
|
|
state,
|
2024-05-12 21:07:21 +02:00
|
|
|
} => self.engine.create(
|
|
|
|
&root,
|
|
|
|
&path.iter().map(|p| p.as_str()).collect::<Vec<_>>(),
|
|
|
|
GraphItem::Item {
|
|
|
|
title,
|
|
|
|
description,
|
|
|
|
state,
|
|
|
|
},
|
|
|
|
)?,
|
|
|
|
Command::Move { root, src, dest } => self.engine.section_move(
|
|
|
|
&root,
|
|
|
|
&src.iter().map(|p| p.as_str()).collect::<Vec<_>>(),
|
|
|
|
&dest.iter().map(|p| p.as_str()).collect::<Vec<_>>(),
|
|
|
|
)?,
|
|
|
|
Command::ToggleItem { root, path } => self
|
|
|
|
.engine
|
|
|
|
.toggle_item(&root, &path.iter().map(|p| p.as_str()).collect::<Vec<_>>())?,
|
|
|
|
Command::UpdateItem {
|
|
|
|
root,
|
|
|
|
path,
|
2024-05-10 12:03:38 +02:00
|
|
|
title,
|
|
|
|
description,
|
|
|
|
state,
|
2024-05-12 21:07:21 +02:00
|
|
|
} => self.engine.update_item(
|
|
|
|
&root,
|
|
|
|
&path.iter().map(|p| p.as_str()).collect::<Vec<_>>(),
|
|
|
|
GraphItem::Item {
|
|
|
|
title,
|
|
|
|
description,
|
|
|
|
state,
|
|
|
|
},
|
|
|
|
)?,
|
|
|
|
}
|
2024-04-29 21:48:01 +02:00
|
|
|
|
2024-05-12 21:07:21 +02:00
|
|
|
self.storage.store(&self.engine)?;
|
2024-04-29 23:34:04 +02:00
|
|
|
|
2024-05-12 21:07:21 +02:00
|
|
|
self.events.enque_command(cmd)?;
|
2024-04-29 23:34:04 +02:00
|
|
|
|
2024-05-12 21:07:21 +02:00
|
|
|
Ok(())
|
|
|
|
}
|
2024-04-29 21:48:01 +02:00
|
|
|
}
|
|
|
|
}
|