use crate::apogee_core_v1; use anyhow::Context; use bevy_ecs::prelude::*; use serde::Deserialize; use std::collections::BTreeMap; use std::{path, sync}; #[derive(Deserialize, Debug)] pub struct Service { pub name: sync::Arc, #[serde(default)] pub description: String, pub command: String, #[serde(default)] pub args: Vec, #[serde(default)] pub conditions: Vec, pub ready: Condition, pub running: Condition, #[serde(default)] pub env: BTreeMap, pub restart: Restart, #[serde(default)] pub notify: Notify, } #[derive(Deserialize, Debug)] pub struct Task { pub name: sync::Arc, #[serde(default)] pub description: String, pub command: String, #[serde(default)] pub args: Vec, #[serde(default)] pub conditions: Vec, pub running: Condition, pub successful: Condition, #[serde(default)] pub env: BTreeMap, } #[derive(Component, Deserialize, Debug, Default, PartialEq, Eq)] pub enum Notify { #[default] None, Systemd, S6, } #[derive(Deserialize, Debug)] pub struct Condition { pub name: sync::Arc, pub immutable: bool, } #[derive(Deserialize, Debug)] pub struct Configuration { #[serde(default)] pub conditions: Vec, #[serde(default)] pub services: Vec, #[serde(default)] pub tasks: Vec, } #[derive(Deserialize, Resource)] pub struct Config(pub path::PathBuf); #[derive(Deserialize, Debug)] pub struct Restart { pub on: apogee_core_v1::RestartPolicy, #[serde(default = "default_restart_delay")] pub delay: u64, } const fn default_restart_delay() -> u64 { 5 } impl Config { pub fn load(&self) -> anyhow::Result { serde_dhall::from_file(&self.0) .imports(true) .parse::() .context("evaluating Dhall config") } }