diff options
Diffstat (limited to 'src/types.rs')
-rw-r--r-- | src/types.rs | 66 |
1 files changed, 40 insertions, 26 deletions
diff --git a/src/types.rs b/src/types.rs index 9a9e2b9..6b6c4ff 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,37 +1,18 @@ use serde::{Deserialize, Serialize}; use sha2::Sha256; -use std::collections::HashMap; +use std::{collections::HashMap, fmt::Display}; -pub type TaskID = String; +use crate::util::cjson; -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TaskDef { - #[serde(default)] - pub depends: Vec<TaskID>, - #[serde(default)] - pub output: Vec<String>, - pub run: String, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Task { - pub id: TaskID, - pub def: TaskDef, - pub depends: HashMap<TaskID, OutputHash>, -} - -#[derive(Debug, Default)] -pub struct TaskMap(pub HashMap<String, TaskDef>); +#[derive(Clone, Copy, Debug)] +pub struct StringHash(pub [u8; 32]); -impl TaskMap { - pub fn get(&self, task: &TaskID) -> Option<&TaskDef> { - self.0.get(task) +impl Display for StringHash { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&hex::encode(self.0)) } } -#[derive(Clone, Copy, Debug)] -pub struct StringHash(pub [u8; 32]); - impl Serialize for StringHash { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where @@ -55,6 +36,39 @@ pub type InputHash = StringHash; pub type OutputHasher = Sha256; pub type OutputHash = StringHash; +pub type TaskID = String; + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct TaskDef { + #[serde(default)] + pub depends: Vec<TaskID>, + #[serde(default)] + pub output: Vec<String>, + pub run: String, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct Task { + pub id: TaskID, + pub def: TaskDef, + pub depends: HashMap<TaskID, OutputHash>, +} + +impl Task { + pub fn input_hash(&self) -> InputHash { + StringHash(cjson::digest::<InputHasher, _>(self).unwrap().into()) + } +} + +#[derive(Debug, Default)] +pub struct TaskMap(pub HashMap<String, TaskDef>); + +impl TaskMap { + pub fn get(&self, task: &TaskID) -> Option<&TaskDef> { + self.0.get(task) + } +} + #[derive(Clone, Debug, Deserialize, Serialize)] pub struct TaskOutput { pub id: TaskID, |