Skip to main content

walrus_daemon/service/
config.rs

1//! Service configuration types for `[services.*]` in `walrus.toml`.
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use std::collections::BTreeMap;
6
7/// Kind of managed service.
8#[derive(Debug, Clone, Default, Serialize, Deserialize)]
9#[serde(rename_all = "snake_case")]
10pub enum ServiceKind {
11    /// Extension service — speaks Walrus Extension protocol over UDS.
12    #[default]
13    Extension,
14    /// Gateway service — speaks existing walrus protocol (e.g. Telegram).
15    Gateway,
16}
17
18/// Restart policy for a managed service.
19#[derive(Debug, Clone, Default, Serialize, Deserialize)]
20#[serde(rename_all = "snake_case")]
21pub enum RestartPolicy {
22    /// Never restart on exit.
23    #[default]
24    Never,
25    /// Restart only on non-zero exit.
26    OnFailure,
27    /// Always restart.
28    Always,
29}
30
31/// Per-service configuration from `[services.<name>]`.
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct ServiceConfig {
34    /// Human-readable description (for hub display).
35    #[serde(default)]
36    pub description: Option<String>,
37    /// Service kind.
38    #[serde(default)]
39    pub kind: ServiceKind,
40    /// Cargo package name (e.g. "walrus-memory"). Used as binary name and for
41    /// `cargo install` during hub installation.
42    #[serde(rename = "crate", alias = "krate")]
43    pub krate: String,
44    /// Restart policy.
45    #[serde(default)]
46    pub restart: RestartPolicy,
47    /// Whether the service is enabled.
48    #[serde(default = "default_true")]
49    pub enabled: bool,
50    /// Environment variables injected into the child process.
51    #[serde(default)]
52    pub env: BTreeMap<String, String>,
53    /// Opaque service-specific configuration (forwarded via extension Configure).
54    #[serde(default)]
55    pub config: Value,
56}
57
58fn default_true() -> bool {
59    true
60}