#![forbid(unsafe_code)]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum OcrUnavailableReason {
DylibMissing,
FeatureDisabled,
EngineNotProvided,
ModelLoadFailed {
detail: String,
},
InitPanicked {
detail: String,
},
}
impl OcrUnavailableReason {
pub fn kind_str(&self) -> &'static str {
match self {
Self::DylibMissing => "dylib_missing",
Self::FeatureDisabled => "feature_disabled",
Self::EngineNotProvided => "engine_not_provided",
Self::ModelLoadFailed { .. } => "model_load_failed",
Self::InitPanicked { .. } => "init_panicked",
}
}
pub fn detail(&self) -> String {
match self {
Self::ModelLoadFailed { detail } | Self::InitPanicked { detail } => detail.clone(),
_ => String::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ocr_unavailable_kind_str_stable() {
assert_eq!(OcrUnavailableReason::DylibMissing.kind_str(), "dylib_missing");
assert_eq!(OcrUnavailableReason::EngineNotProvided.kind_str(), "engine_not_provided");
assert_eq!(
OcrUnavailableReason::ModelLoadFailed { detail: "x".into() }.kind_str(),
"model_load_failed"
);
}
#[test]
fn ocr_unavailable_detail_passthrough() {
let r = OcrUnavailableReason::ModelLoadFailed {
detail: "missing.onnx".into(),
};
assert_eq!(r.detail(), "missing.onnx");
assert_eq!(OcrUnavailableReason::DylibMissing.detail(), "");
}
}