use serde::{Deserialize, Serialize}; use sha2::Sha256; use std::collections::HashMap; pub type TaskRef = String; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct TaskDef { #[serde(default)] pub depends: Vec, #[serde(default)] pub output: Vec, pub run: String, } #[derive(Debug, Default)] pub struct TaskMap(pub HashMap); impl TaskMap { pub fn get(&self, task: &TaskRef) -> Option<&TaskDef> { self.0.get(task) } } #[derive(Clone, Copy, Debug)] pub struct StringHash(pub [u8; 32]); impl Serialize for StringHash { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { hex::serde::serialize(self.0, serializer) } } impl<'de> Deserialize<'de> for StringHash { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { Ok(StringHash(hex::serde::deserialize(deserializer)?)) } } pub type OutputHasher = Sha256; pub type OutputHash = StringHash; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct TaskOutput { pub task_ref: TaskRef, pub depends: HashMap, pub output_hash: OutputHash, }