1use std::fs;
2use std::path::PathBuf;
3
4use anyhow::{Context, Result};
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct VaultConfig {
10 pub vault_id: String,
11 pub project_name: Option<String>,
12 pub storage_provider: String,
13 pub relay_url: Option<String>,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct IdentityConfig {
19 pub github_username: String,
20 pub ssh_private_key: String,
21 pub ssh_public_key: String,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct HistoryEntry {
27 pub timestamp_unix: u64,
28 pub source: String,
30 pub manifest_version: u64,
31 pub file_count: usize,
32}
33
34#[derive(Debug, Clone, Default, Serialize, Deserialize)]
36pub struct GlobalConfig {
37 pub install_method: Option<String>,
39 pub last_version_check_unix: Option<u64>,
41 pub latest_known_version: Option<String>,
43}
44
45pub fn global_config_path() -> Option<PathBuf> {
47 dirs::config_dir().map(|d| d.join("vyn").join("global.toml"))
48}
49
50pub fn load_global_config() -> GlobalConfig {
52 let path = match global_config_path() {
53 Some(p) => p,
54 None => return GlobalConfig::default(),
55 };
56 let text = match fs::read_to_string(&path) {
57 Ok(t) => t,
58 Err(_) => return GlobalConfig::default(),
59 };
60 toml::from_str(&text).unwrap_or_default()
61}
62
63pub fn save_global_config(cfg: &GlobalConfig) -> Result<()> {
65 let path = global_config_path().context("cannot determine config directory")?;
66 if let Some(parent) = path.parent() {
67 fs::create_dir_all(parent).context("cannot create config directory")?;
68 }
69 let text = toml::to_string(cfg).context("cannot serialize global config")?;
70 fs::write(&path, text).context("cannot write global config")?;
71 Ok(())
72}