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, Discord).
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")]
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}