use serde::{Deserialize, Serialize}; use sha2::Sha256; use std::{collections::HashMap, fmt::Display}; use crate::util::cjson; #[derive(Clone, Copy, Debug)] pub struct StringHash(pub [u8; 32]); impl Display for StringHash { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(&hex::encode(self.0)) } } impl Serialize for StringHash { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { hex::serialize(self.0, serializer) } } impl<'de> Deserialize<'de> for StringHash { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { Ok(StringHash(hex::deserialize(deserializer)?)) } } pub type InputHasher = Sha256; 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, #[serde(default)] pub run: String, } #[derive(Clone, Debug, Deserialize, Serialize)] pub struct Task { pub id: TaskID, pub def: TaskDef, pub depends: HashMap, pub env: HashMap, } impl Task { pub fn input_hash(&self) -> InputHash { StringHash(cjson::digest::(self).unwrap().into()) } } #[derive(Debug, Default)] pub struct TaskMap(pub HashMap); 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, pub depends: HashMap, pub env: HashMap, pub input_hash: InputHash, pub output_hash: OutputHash, }