use derive_more::{IsVariant, TryUnwrap, Unwrap};
use crate::domain::primitives::{LocationError, Uuid7Error};
#[derive(Debug, Clone, PartialEq, Eq, IsVariant, Unwrap, TryUnwrap, thiserror::Error)]
#[unwrap(ref, ref_mut)]
#[try_unwrap(ref, ref_mut)]
#[non_exhaustive]
pub enum BuffaError {
#[error("wire Id.value must be 16 bytes, got {0}")]
IdWrongLength(usize),
#[error("wire Id failed Uuid7 invariant: {0}")]
IdInvalid(#[from] Uuid7Error),
#[error("wire FileChecksum.value must be 32 bytes, got {0}")]
ChecksumWrongLength(usize),
#[error("wire Local.volume is unset")]
MissingLocationVolume,
#[error("wire Local failed domain validation: {0}")]
Location(#[from] LocationError),
#[error("wire Location.kind variant not supported by the domain")]
UnsupportedLocationKind,
#[error("wire timestamp {0} ms is outside jiff::Timestamp range")]
TimestampOutOfRange(i64),
#[error("wire enum carries unknown value {0} for a closed domain enum")]
UnknownEnumValue(i32),
#[error("wire message is missing required field `{0}`")]
MissingRequiredField(&'static str),
#[error("wire gps_location is not a valid ISO 6709 location: {0:?}")]
GpsLocationMalformed(smol_str::SmolStr),
#[error("wire Language.bcp47 is not a valid BCP-47 tag: {0:?}")]
LanguageMalformed(smol_str::SmolStr),
#[error("wire SubtitleCue.kind `{0}` not yet implemented (issue #56)")]
UnimplementedSubtitleCueKind(i32),
#[error("wire SubtitleCue.data oneof is unset for kind `{0:?}`")]
MissingSubtitleCueData(&'static str),
#[error("wire SubtitleCue.kind `{0}` does not match data oneof variant `{1}`")]
SubtitleCueKindOneofMismatch(&'static str, &'static str),
#[error("wire SubtitleCue numeric field `{0}` value {1} is out of range for the domain")]
SubtitleNumericOutOfRange(&'static str, i32),
}