summaryrefslogtreecommitdiffstats
path: root/src/types.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/types.rs')
-rw-r--r--src/types.rs66
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,