diff options
| -rw-r--r-- | src/tasks.rs | 4 | ||||
| -rw-r--r-- | src/tasks/server.rs | 46 |
2 files changed, 48 insertions, 2 deletions
diff --git a/src/tasks.rs b/src/tasks.rs index 3e76ce4..069f9c2 100644 --- a/src/tasks.rs +++ b/src/tasks.rs @@ -4,9 +4,9 @@ pub type TaskOutput = Result<String, String>; pub mod client; pub mod server; -pub struct Task<N> { +pub struct Task<N, T = ()> { pub name: N, - pub exec: fn(&[&str]) -> TaskOutput, + pub exec: fn(&[&str], T) -> TaskOutput, } #[derive(Deserialize)] diff --git a/src/tasks/server.rs b/src/tasks/server.rs index e69de29..0896dca 100644 --- a/src/tasks/server.rs +++ b/src/tasks/server.rs @@ -0,0 +1,46 @@ +use std::fmt::Display; + +use crate::tasks::{IntoTaskErr, Task as BaseTask, TaskOutput}; +use serde::Deserialize; + +pub struct Task<T = ()>(pub BaseTask<Name, T>); + +#[derive(Debug, Deserialize, Clone, Copy)] +pub enum Name { + GetIp, +} + +impl Display for Name { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "{:?}", self) + } +} + +pub const TASKS: &[Task] = &[Task::<i32>(BaseTask { name: Name::GetIp, exec: get_ip })]; + +fn get_ip(cmds: &[&str], _: i32) -> TaskOutput {} + +impl TryFrom<&str> for &'static Task { + type Error = IntoTaskErr; + + fn try_from(value: &str) -> Result<Self, Self::Error> { + for task in TASKS { + if task.0.name.to_string() == value { + return Ok(task); + } + } + Err(IntoTaskErr::NotFound(value.to_string())) + } +} + +impl From<Task> for BaseTask<Name> { + fn from(value: Task) -> Self { + value.0 + } +} + +impl AsRef<BaseTask<Name>> for Task { + fn as_ref(&self) -> &BaseTask<Name> { + &self.0 + } +} |
