use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NamErrorCode {
FileNotFound,
FileReadError,
UnknownExtension,
NamJsonParseError,
NamJsonWeightsExceedLimit,
NamJsonTrainingTooLarge,
NamJsonTrainingTooDeep,
NamJsonSubmodelsExceedLimit,
NamJsonSubmodelsTooDeep,
NamJsonWeightNotFinite,
NamJsonInvalidSampleRate,
NamJsonUnsupportedTopology,
NamJsonInvalidVersionFormat,
NamJsonUnsupportedVersion,
NamJsonUnsupportedMultiChannel,
NambNonFiniteWeight,
NambInvalidHeaderField,
NambCrc32Mismatch,
NambCrc32Missing,
NambInvalidMagic,
NambUnsupportedVersion,
NambTruncated,
UnsupportedArchitecture,
TopologyDetectionFailed,
WeightCountMismatch,
ModelBuildFailed,
ModelTooLarge,
PipewireInitFailed,
StreamConnectFailed,
ResamplerBuildFailed,
ResamplerChannelFull,
SchedFifoDenied,
CpuAffinityFailed,
DeadlineExceeded,
ParamChannelFull,
InvalidGainValue,
UnknownCommand,
CtrlCHandlerFailed,
IrLoadFailed,
GcOverflow,
GcCorrupted,
OutOfMemory,
}
impl NamErrorCode {
pub fn code(self) -> &'static str {
match self {
Self::FileNotFound => "E1100",
Self::FileReadError => "E1101",
Self::UnknownExtension => "E1102",
Self::NamJsonParseError => "E1200",
Self::NamJsonWeightsExceedLimit => "E1206",
Self::NamJsonTrainingTooLarge => "E1207",
Self::NamJsonTrainingTooDeep => "E1208",
Self::NamJsonSubmodelsExceedLimit => "E1209",
Self::NamJsonSubmodelsTooDeep => "E1210",
Self::NamJsonWeightNotFinite => "E1211",
Self::NamJsonInvalidSampleRate => "E1214",
Self::NamJsonUnsupportedTopology => "E1215",
Self::NamJsonInvalidVersionFormat => "E1216",
Self::NamJsonUnsupportedVersion => "E1217",
Self::NamJsonUnsupportedMultiChannel => "E1218",
Self::NambNonFiniteWeight => "E1212",
Self::NambInvalidHeaderField => "E1213",
Self::NambCrc32Mismatch => "E1201",
Self::NambCrc32Missing => "E1205",
Self::NambInvalidMagic => "E1202",
Self::NambUnsupportedVersion => "E1203",
Self::NambTruncated => "E1204",
Self::UnsupportedArchitecture => "E1300",
Self::TopologyDetectionFailed => "E1301",
Self::WeightCountMismatch => "E1302",
Self::ModelBuildFailed => "E1303",
Self::ModelTooLarge => "E1304",
Self::PipewireInitFailed => "E2100",
Self::StreamConnectFailed => "E2101",
Self::ResamplerBuildFailed => "E2200",
Self::ResamplerChannelFull => "E2201",
Self::SchedFifoDenied => "E2300",
Self::CpuAffinityFailed => "E2301",
Self::DeadlineExceeded => "E2001",
Self::ParamChannelFull => "E3100",
Self::GcOverflow => "E3101",
Self::GcCorrupted => "E3102",
Self::InvalidGainValue => "E4100",
Self::UnknownCommand => "E4101",
Self::CtrlCHandlerFailed => "E4102",
Self::IrLoadFailed => "E4103",
Self::OutOfMemory => "E5000",
}
}
pub fn message(self) -> &'static str {
match self {
Self::FileNotFound => "File not found",
Self::FileReadError => "File read error",
Self::UnknownExtension => "Unknown extension",
Self::NamJsonParseError => "Invalid JSON format",
Self::NamJsonWeightsExceedLimit => "JSON weights exceed limit",
Self::NamJsonTrainingTooLarge => "Training metadata too large",
Self::NamJsonTrainingTooDeep => "Training metadata too deeply nested",
Self::NamJsonSubmodelsExceedLimit => "Submodels count exceeds limit (max 8)",
Self::NamJsonSubmodelsTooDeep => "Container nesting too deep",
Self::NamJsonWeightNotFinite => "JSON weight is non-finite (NaN/Inf)",
Self::NamJsonInvalidSampleRate => {
"JSON sample_rate is invalid (must be finite and > 0)"
}
Self::NamJsonUnsupportedTopology => {
"JSON topology exceeds OOM safety limits (MAX_LAYERS or MAX_HIDDEN_SIZE)"
}
Self::NamJsonInvalidVersionFormat => "JSON version string is not parseable as SemVer",
Self::NamJsonUnsupportedVersion => {
"JSON version is outside the supported range (min 0.5.0, max 0.7.x)"
}
Self::NamJsonUnsupportedMultiChannel => {
"LSTM model has multi-channel I/O (only mono supported)"
}
Self::NambNonFiniteWeight => "NAMB weight is non-finite (NaN/Inf)",
Self::NambInvalidHeaderField => "NAMB header field is invalid",
Self::NambCrc32Mismatch => "CRC32 checksum mismatch",
Self::NambCrc32Missing => "CRC32 integrity flag missing (v2+)",
Self::NambInvalidMagic => "Invalid signature",
Self::NambUnsupportedVersion => "Unsupported version",
Self::NambTruncated => "Corrupted/truncated file",
Self::UnsupportedArchitecture => "Unsupported architecture",
Self::TopologyDetectionFailed => "Topology detection failed",
Self::WeightCountMismatch => "Weight count mismatch",
Self::ModelBuildFailed => "Model build failed",
Self::ModelTooLarge => "Model file too large",
Self::PipewireInitFailed => "PipeWire initialization failed",
Self::StreamConnectFailed => "Stream connection failed",
Self::ResamplerBuildFailed => "Resampler build failed",
Self::ResamplerChannelFull => "Resampler channel full",
Self::SchedFifoDenied => "SCHED_FIFO denied",
Self::CpuAffinityFailed => "CPU affinity setting failed",
Self::DeadlineExceeded => "Processing deadline exceeded",
Self::ParamChannelFull => "Parameter channel full",
Self::GcOverflow => "Garbage collection overflow",
Self::GcCorrupted => "Garbage collection corruption",
Self::InvalidGainValue => "Invalid gain value",
Self::UnknownCommand => "Unknown command",
Self::CtrlCHandlerFailed => "Ctrl-C handler setup failed",
Self::IrLoadFailed => "Cab-sim IR load failed",
Self::OutOfMemory => "Out of memory",
}
}
pub fn mnemonic(self) -> &'static str {
match self {
Self::FileNotFound => "FILE_NOT_FOUND",
Self::FileReadError => "FILE_READ_ERROR",
Self::UnknownExtension => "UNKNOWN_EXTENSION",
Self::NamJsonParseError => "NAM_JSON_PARSE_ERROR",
Self::NamJsonWeightsExceedLimit => "NAM_JSON_WEIGHTS_EXCEED_LIMIT",
Self::NamJsonTrainingTooLarge => "NAM_JSON_TRAINING_TOO_LARGE",
Self::NamJsonTrainingTooDeep => "NAM_JSON_TRAINING_TOO_DEEP",
Self::NamJsonSubmodelsExceedLimit => "NAM_JSON_SUBMODELS_EXCEED_LIMIT",
Self::NamJsonSubmodelsTooDeep => "NAM_JSON_SUBMODELS_TOO_DEEP",
Self::NamJsonWeightNotFinite => "NAM_JSON_WEIGHT_NOT_FINITE",
Self::NamJsonInvalidSampleRate => "NAM_JSON_INVALID_SAMPLE_RATE",
Self::NamJsonUnsupportedTopology => "NAM_JSON_UNSUPPORTED_TOPOLOGY",
Self::NamJsonInvalidVersionFormat => "NAM_JSON_INVALID_VERSION_FORMAT",
Self::NamJsonUnsupportedVersion => "NAM_JSON_UNSUPPORTED_VERSION",
Self::NamJsonUnsupportedMultiChannel => "NAM_JSON_UNSUPPORTED_MULTI_CHANNEL",
Self::NambNonFiniteWeight => "NAMB_NON_FINITE_WEIGHT",
Self::NambInvalidHeaderField => "NAMB_INVALID_HEADER_FIELD",
Self::NambCrc32Mismatch => "NAMB_CRC32_MISMATCH",
Self::NambCrc32Missing => "NAMB_CRC32_MISSING",
Self::NambInvalidMagic => "NAMB_INVALID_MAGIC",
Self::NambUnsupportedVersion => "NAMB_UNSUPPORTED_VERSION",
Self::NambTruncated => "NAMB_TRUNCATED",
Self::UnsupportedArchitecture => "UNSUPPORTED_ARCHITECTURE",
Self::TopologyDetectionFailed => "TOPOLOGY_DETECTION_FAILED",
Self::WeightCountMismatch => "WEIGHT_COUNT_MISMATCH",
Self::ModelBuildFailed => "MODEL_BUILD_FAILED",
Self::ModelTooLarge => "MODEL_TOO_LARGE",
Self::PipewireInitFailed => "PIPEWIRE_INIT_FAILED",
Self::StreamConnectFailed => "STREAM_CONNECT_FAILED",
Self::ResamplerBuildFailed => "RESAMPLER_BUILD_FAILED",
Self::ResamplerChannelFull => "RESAMPLER_CHANNEL_FULL",
Self::SchedFifoDenied => "SCHED_FIFO_DENIED",
Self::CpuAffinityFailed => "CPU_AFFINITY_FAILED",
Self::DeadlineExceeded => "DEADLINE_EXCEEDED",
Self::ParamChannelFull => "PARAM_CHANNEL_FULL",
Self::GcOverflow => "GC_OVERFLOW",
Self::GcCorrupted => "GC_CORRUPTED",
Self::InvalidGainValue => "INVALID_GAIN_VALUE",
Self::UnknownCommand => "UNKNOWN_COMMAND",
Self::CtrlCHandlerFailed => "CTRL_C_HANDLER_FAILED",
Self::IrLoadFailed => "IR_LOAD_FAILED",
Self::OutOfMemory => "OUT_OF_MEMORY",
}
}
}
impl std::error::Error for NamErrorCode {}
impl fmt::Display for NamErrorCode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{} | {}", self.code(), self.mnemonic())
}
}