use std::time::Duration;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("el nombre del volcado no puede estar vacío ni llevar separadores: {nombre:?}")]
NombreDeVolcadoInvalido { nombre: String },
#[error(
"el archivado del volcado `{nombre}` se rindió y ya nadie lee del túnel: el productor \
tiene que terminar su bucle y morir, sin entrar en pánico —un pánico aquí deja el hilo \
envenenado y la unión de la copia se cuelga—"
)]
ElArchivadoSeRindio { nombre: String },
#[error(
"el volcado `{nombre}` lleva más de {inactividad:?} sin entregar un solo byte: el \
productor puede estar muerto o atascado, y el canal sigue abierto porque su extremo vive \
en alguna parte —archivarlo así daría por buena una copia incompleta—"
)]
VolcadoEstancado {
nombre: String,
inactividad: Duration,
},
#[error("la fila del repositorio no puede ponerse en marcha: `{campo}` está sin informar")]
AccesoInvalido { campo: String },
#[error("no se ha podido poner en marcha el repositorio en `{destino}`: {motivo}")]
DestinoNoAlcanzable { destino: String, motivo: String },
#[error("la passphrase no abre el repositorio de `{destino}`: {motivo}")]
PassphraseNoAbre { destino: String, motivo: String },
#[error(
"la copia declara el volcado `{en_la_copia}` y el origen que se le entrega trae \
`{en_el_origen}`: el nombre que la instantánea publica tiene que ser el del nodo que \
se archiva, o la copia quedará diciendo que contiene lo que no tiene"
)]
NombreDeVolcadoIncoherente {
en_la_copia: String,
en_el_origen: String,
},
#[error("la copia de la tarea `{etiqueta}` no declara ninguna ruta que copiar")]
CopiaSinRutas { etiqueta: String },
#[error("ha fallado el archivado de la copia de la tarea `{etiqueta}`: {motivo}")]
CopiaFallida { etiqueta: String, motivo: String },
#[error("ha fallado la retención: {motivo}")]
RetencionFallida { motivo: String },
#[error(
"las tres reglas de retención valen cero (`keep_daily`, `keep_weekly` y \
`keep_monthly`): eso no conserva de menos, borra el historial entero del \
repositorio —incluida la copia recién hecha—, así que no se aplica"
)]
RetencionQueLoBorraTodo,
#[error("no se han podido listar las instantáneas de `{destino}`: {motivo}")]
ListadoFallido { destino: String, motivo: String },
#[error("no se ha podido retirar la instantánea de `{destino}`: {motivo}")]
OlvidoFallido { destino: String, motivo: String },
#[error("no se ha podido restaurar `{instantanea}` desde `{destino}`: {motivo}")]
RestauracionFallida {
destino: String,
instantanea: String,
motivo: String,
},
#[error(
"la instantánea `{instantanea}` de `{destino}` no trae un único volcado: tiene \
{encontrados} nodos de fichero, y una restauración de base espera uno solo"
)]
VolcadoQueNoEsUno {
destino: String,
instantanea: String,
encontrados: usize,
},
}