xberg-candle-ocr 1.2.0

Candle-based VLM OCR engines for Xberg - pure-Rust transformer OCR (TrOCR, PaddleOCR-VL, GLM-OCR)
use candle_core::Device;

use crate::error::Result;

#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum DevicePreference {
    #[default]
    Auto,
    Cpu,
    Cuda,
    Metal,
}

impl DevicePreference {
    pub fn select(self) -> Result<Device> {
        let device = match self {
            DevicePreference::Cpu => Device::Cpu,
            DevicePreference::Cuda => Device::new_cuda(0)?,
            DevicePreference::Metal => Device::new_metal(0)?,
            DevicePreference::Auto => {
                if cfg!(feature = "cuda") {
                    Device::new_cuda(0).unwrap_or(Device::Cpu)
                } else if cfg!(feature = "metal") {
                    Device::new_metal(0).unwrap_or(Device::Cpu)
                } else {
                    Device::Cpu
                }
            }
        };
        Ok(device)
    }
}