mesh-llm-types 0.74.0

Shared protocol-facing data types for Mesh LLM crates
Documentation
use serde::{Deserialize, Deserializer, Serialize, de};

const MODEL_RUNTIME_KIND_VARIANTS: &[&str] = &["auto", "cpu", "cuda", "rocm", "metal", "vulkan"];

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

impl ModelRuntimeKind {
    pub const fn as_str(self) -> &'static str {
        match self {
            Self::Auto => "auto",
            Self::Cpu => "cpu",
            Self::Cuda => "cuda",
            Self::Rocm => "rocm",
            Self::Metal => "metal",
            Self::Vulkan => "vulkan",
        }
    }

    pub fn parse_str(value: &str) -> Option<Self> {
        match value.trim().to_ascii_lowercase().as_str() {
            "auto" => Some(Self::Auto),
            "cpu" => Some(Self::Cpu),
            "cuda" => Some(Self::Cuda),
            "rocm" => Some(Self::Rocm),
            "metal" => Some(Self::Metal),
            "vulkan" => Some(Self::Vulkan),
            _ => None,
        }
    }
}

impl<'de> Deserialize<'de> for ModelRuntimeKind {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let value = String::deserialize(deserializer)?;
        Self::parse_str(&value)
            .ok_or_else(|| de::Error::unknown_variant(&value, MODEL_RUNTIME_KIND_VARIANTS))
    }
}