use std::collections::{BTreeMap, HashMap};
use serde::{Deserialize, Serialize};
use zeroize::Zeroizing;
pub const VAULT_VERSION: &str = "2.0";
pub const DEFAULT_VAULT_NAME: &str = ".murk";
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Vault {
pub version: String,
pub created: String,
pub vault_name: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub repo: String,
pub recipients: Vec<String>,
pub schema: BTreeMap<String, SchemaEntry>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub policy: Option<Policy>,
pub secrets: BTreeMap<String, SecretEntry>,
pub meta: String,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaEntry {
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub example: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rotation_interval_days: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub revoked_at: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct SecretEntry {
pub shared: String,
#[serde(rename = "scoped", default, skip_serializing_if = "BTreeMap::is_empty")]
pub private: BTreeMap<String, String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub grouped: BTreeMap<String, String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct GrantEntry {
pub pubkey: String,
pub scope: Vec<String>,
pub issued_at: String,
pub expires_at: String,
pub issuer: String,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Policy {
#[serde(default)]
pub agent_allow_tags: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct VaultSignature {
pub signer: String,
pub v: u32,
pub sig: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Meta {
pub recipients: HashMap<String, String>,
pub mac: String,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub signers: BTreeMap<String, String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sig: Option<VaultSignature>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "hmac_key")]
pub mac_key: Option<String>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub github_pins: HashMap<String, Vec<String>>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub groups: BTreeMap<String, Vec<String>>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub grants: BTreeMap<String, GrantEntry>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum SignatureState {
Signed { signer: String, anchored: bool },
#[default]
Unsigned,
}
#[derive(Debug, Clone, Default)]
pub struct Murk {
pub values: HashMap<String, Zeroizing<String>>,
pub recipients: HashMap<String, String>,
pub private: HashMap<String, HashMap<String, Zeroizing<String>>>,
pub grouped: HashMap<String, HashMap<String, Zeroizing<String>>>,
pub groups: BTreeMap<String, Vec<String>>,
pub grants: BTreeMap<String, GrantEntry>,
pub legacy_mac: bool,
pub github_pins: HashMap<String, Vec<String>>,
pub signers: BTreeMap<String, String>,
pub signature: SignatureState,
}