Skip to main content

cfgd_core/modules/
mod.rs

1// Module system — self-contained, portable configuration units
2//
3// Handles module loading, dependency resolution (topological sort),
4// cross-platform package resolution, and git file source management.
5//
6// Dependency rules: depends on config/, errors/, platform/, providers/ (trait only).
7// Must NOT import files/, packages/, secrets/, reconciler/, state/, daemon/.
8
9use std::collections::HashMap;
10use std::path::PathBuf;
11
12use serde::Serialize;
13
14use crate::config::{EnvVar, ModuleSpec, ShellAlias};
15
16mod git;
17mod loader;
18mod lockfile;
19mod registry;
20mod resolve;
21
22pub use git::{
23    GitSource, TagSignatureStatus, check_tag_signature, default_module_cache_dir, fetch_git_source,
24    get_head_commit_sha, git_cache_dir, is_git_source, parse_git_source,
25};
26pub use loader::{load_module, load_modules, resolve_dependency_order};
27pub use lockfile::{
28    diff_module_specs, hash_module_contents, load_all_modules, load_locked_modules, load_lockfile,
29    save_lockfile, verify_lockfile_integrity,
30};
31pub use registry::{
32    FetchedRemoteModule, RegistryModule, RegistryRef, extract_registry_name,
33    fetch_registry_modules, fetch_remote_module, is_registry_ref, latest_module_version,
34    parse_registry_ref, resolve_profile_module_name,
35};
36pub use resolve::{
37    resolve_module_files, resolve_module_packages, resolve_modules, resolve_package,
38};
39
40// ---------------------------------------------------------------------------
41// Resolved types — output of module resolution
42// ---------------------------------------------------------------------------
43
44/// A package resolved to a concrete manager and name.
45#[derive(Debug, Clone, Serialize)]
46pub struct ResolvedPackage {
47    /// Canonical name from the module spec.
48    pub canonical_name: String,
49    /// Actual name for the manager (after alias resolution).
50    pub resolved_name: String,
51    /// Which manager will install it. `"script"` means use a custom install script.
52    pub manager: String,
53    /// Available version (if queried).
54    pub version: Option<String>,
55    /// Install script content (inline or file path). Only set when `manager == "script"`.
56    pub script: Option<String>,
57}
58
59/// A file resolved to a concrete local path.
60#[derive(Debug, Clone, Serialize)]
61pub struct ResolvedFile {
62    /// Local source path (after git clone if needed).
63    pub source: PathBuf,
64    /// Target path on the machine.
65    pub target: PathBuf,
66    /// Whether the source was fetched from git.
67    pub is_git_source: bool,
68    /// Per-file deployment strategy override (from module spec).
69    pub strategy: Option<crate::config::FileStrategy>,
70    /// Encryption settings carried from the module file entry.
71    pub encryption: Option<crate::config::EncryptionSpec>,
72}
73
74/// A fully resolved module — ready for the reconciler.
75#[derive(Debug, Clone, Serialize)]
76pub struct ResolvedModule {
77    pub name: String,
78    pub packages: Vec<ResolvedPackage>,
79    pub files: Vec<ResolvedFile>,
80    pub env: Vec<EnvVar>,
81    pub aliases: Vec<ShellAlias>,
82    /// System configurator settings declared by this module.
83    /// Deep-merged into the profile system map during reconciliation; module wins on conflict.
84    pub system: HashMap<String, serde_yaml::Value>,
85    pub pre_apply_scripts: Vec<crate::config::ScriptEntry>,
86    pub post_apply_scripts: Vec<crate::config::ScriptEntry>,
87    pub pre_reconcile_scripts: Vec<crate::config::ScriptEntry>,
88    pub post_reconcile_scripts: Vec<crate::config::ScriptEntry>,
89    pub on_change_scripts: Vec<crate::config::ScriptEntry>,
90    pub depends: Vec<String>,
91    /// Module directory — used as working directory for module scripts.
92    pub dir: PathBuf,
93}
94
95// ---------------------------------------------------------------------------
96// Loaded module — parsed from YAML but not yet resolved
97// ---------------------------------------------------------------------------
98
99/// A module loaded from disk.
100#[derive(Debug, Clone, Serialize)]
101pub struct LoadedModule {
102    pub name: String,
103    pub spec: ModuleSpec,
104    pub dir: PathBuf,
105}
106
107// ---------------------------------------------------------------------------
108// Tests
109// ---------------------------------------------------------------------------
110
111#[cfg(test)]
112mod tests;