gradatum-vault 0.4.3

Multi-vault registry + lifecycle (create/list/swap/delete) + forward-compat
Documentation
//! Erreurs propres au crate `gradatum-vault`.
//!
//! `VaultError` encapsule les erreurs des couches sous-jacentes
//! et ajoute des variantes spécifiques au vault (opération lifecycle, override, drift).
//!
//! Règle Rust-grade : pas de `Box<dyn Error>` en lib publique — typage fort via `thiserror`.

use thiserror::Error;

/// Erreur top-level de `gradatum-vault`.
///
/// Produite par toutes les opérations publiques du vault (create/open, lifecycle,
/// overrides, drift, cache effective_note).
#[derive(Debug, Error)]
pub enum VaultError {
    /// Erreur provenant de `gradatum-core` (note not found, drift, validation, etc.).
    #[error("core: {0}")]
    Core(#[from] gradatum_core::error::GradatumError),

    /// Erreur de stockage (OpenDAL, filesystem, NFS check).
    ///
    /// Note : `StorageError` peut lui-même encapsuler `GradatumError::VaultOnNfs` (C11).
    #[error("storage: {0}")]
    Storage(String),

    /// Erreur de sérialisation/parsing Markdown.
    #[error("markdown: {0}")]
    Markdown(String),

    /// F-41 — Conflit optimistic-lock : le `expected_sha256` fourni ne correspond pas
    /// au hash courant de la note. Porte le hash courant pour permettre la résolution.
    ///
    /// Produit par `write_if_match` quand
    /// `expected_sha256 != current_sha256` et que la note existe déjà.
    ///
    /// Le `[u8; 32]` est le hash SHA-256 courant (celui du vainqueur concurrent).
    #[error("conflit optimistic-lock : hash courant = {current_sha256}", current_sha256 = gradatum_core::identity::ContentHash(*(.0)).hex())]
    Conflict([u8; 32]),
}

impl From<gradatum_storage::StorageError> for VaultError {
    fn from(e: gradatum_storage::StorageError) -> Self {
        VaultError::Storage(e.to_string())
    }
}

impl From<gradatum_markdown::MarkdownError> for VaultError {
    fn from(e: gradatum_markdown::MarkdownError) -> Self {
        VaultError::Markdown(e.to_string())
    }
}