use std::collections::{HashMap, HashSet}; use serde::Deserialize; use common::{string_hash::StringHash, types::TaskID}; use crate::{ args::{ArgMapping, ArgType}, recipe, }; #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Hash, Default)] pub struct RecipeMeta { #[serde(default)] pub name: String, pub version: Option, } #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Hash)] pub struct TaskDep { #[serde(flatten, deserialize_with = "recipe::deserialize_task_id")] pub id: TaskID, #[serde(default)] pub args: ArgMapping, } #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Hash)] pub struct Fetch { pub name: String, pub sha256: StringHash, } fn default_output_name() -> String { "default".to_string() } #[derive(Clone, Debug, Deserialize)] pub struct InheritDep { #[serde(flatten)] pub dep: TaskDep, } #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Hash)] pub struct OutputDep { #[serde(flatten)] pub dep: TaskDep, #[serde(default)] pub noinherit: bool, #[serde(default = "default_output_name")] pub output: String, } #[derive(Clone, Debug, Deserialize)] pub struct Output { pub path: Option, #[serde(default)] pub runtime_depends: HashSet, } #[derive(Clone, Debug, Deserialize)] pub struct Action { #[serde(default)] pub run: String, } impl Action { pub fn is_empty(&self) -> bool { self.run.is_empty() } } #[derive(Clone, Debug, Deserialize)] pub struct TaskDef { #[serde(skip)] pub meta: RecipeMeta, #[serde(default)] pub args: HashMap, #[serde(default)] pub inherit: Option, #[serde(default)] pub fetch: HashSet, #[serde(default)] pub build_depends: HashSet, #[serde(default)] pub depends: HashSet, #[serde(default)] pub output: HashMap, #[serde(flatten)] pub action: Action, }