use std::path::PathBuf;
use thiserror::Error;
use crate::frontmatter::SchemaVersion;
use crate::identity::{ContentHash, NoteId};
use crate::scope::VaultId;
use crate::status::NoteStatus;
#[derive(Debug, Error)]
pub enum GradatumError {
#[error("erreur de validation : {0}")]
Validation(#[from] ValidationError),
#[error("drift détecté : {0}")]
Drift(#[from] DriftError),
#[error("erreur de stockage : {0}")]
Storage(String),
#[error("erreur parse Markdown : {0}")]
Markdown(String),
#[error("note introuvable : {0:?}")]
NoteNotFound(NoteId),
#[error("transition de statut invalide : {from:?} → {to:?}")]
InvalidStatusTransition {
from: NoteStatus,
to: NoteStatus,
},
#[error("version de schéma incorrecte : attendu {expected}, trouvé {found}")]
SchemaVersionMismatch {
expected: SchemaVersion,
found: SchemaVersion,
},
#[error("vault introuvable : {0:?}")]
VaultNotFound(VaultId),
#[error("vault root sur NFS (NFS_SUPER_MAGIC), non supporté : {path:?}")]
VaultOnNfs {
path: PathBuf,
},
#[error("validation schéma override : {0}")]
SchemaValidation(#[from] crate::schema_registry::ValidationError),
#[error("migration schéma override : {0}")]
SchemaMigration(#[from] crate::schema_registry::MigrationError),
#[error("io : {0}")]
Io(#[from] std::io::Error),
#[error("toml parse : {0}")]
TomlParse(#[from] toml::de::Error),
#[error("toml serialize : {0}")]
TomlSerialize(#[from] toml::ser::Error),
#[error("config : {0}")]
Config(#[from] crate::config::ConfigError),
#[error("inference : {0}")]
Inference(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Error)]
pub enum ValidationError {
#[error("tag invalide : {0:?} (format attendu: ^[a-z0-9][a-z0-9-]{{0,63}}$)")]
InvalidTag(String),
#[error("vault_id invalide : {0:?}")]
InvalidVaultId(String),
#[error("locus_id invalide : {0:?}")]
InvalidLocusId(String),
#[error("section invalide : {0:?}")]
InvalidSection(String),
#[error("statut invalide : {0:?}")]
InvalidStatus(String),
#[error("corps de note vide")]
EmptyBody,
}
#[derive(Debug, Clone, PartialEq, Error)]
pub enum DriftError {
#[error("content hash mismatch: stored={stored}, computed={computed}")]
ContentHashMismatch {
stored: ContentHash,
computed: ContentHash,
},
#[error("fichier md absent sur disque : {note_id:?}")]
NoteMdMissing {
note_id: NoteId,
},
#[error("fichier md orphelin : {0}")]
OrphanMd(String),
}