lutgen-studio 0.1.1

Offical GUI for Lutgen, the best way to apply popular colorschemes to any image or wallpaper!
use std::fmt::Display;
use std::str::FromStr;

use serde::{Deserialize, Serialize};

#[derive(Clone, PartialEq, Eq)]
pub enum DynamicPalette {
    Builtin(lutgen_palettes::Palette),
    Custom,
}

impl Display for DynamicPalette {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::Builtin(p) => f.write_str(&p.to_string()),
            Self::Custom => f.write_str("custom"),
        }
    }
}

impl DynamicPalette {
    pub fn get(&self) -> &[[u8; 3]] {
        match self {
            DynamicPalette::Builtin(palette) => palette.get(),
            DynamicPalette::Custom => &[],
        }
    }
}

impl<'de> Deserialize<'de> for DynamicPalette {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        if &s == "custom" {
            Ok(DynamicPalette::Custom)
        } else {
            lutgen_palettes::Palette::from_str(&s)
                .map(DynamicPalette::Builtin)
                .map_err(|e| serde::de::Error::custom(e.to_string()))
        }
    }
}

impl Serialize for DynamicPalette {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        match self {
            DynamicPalette::Builtin(palette) => serializer.serialize_str(&palette.to_string()),
            DynamicPalette::Custom => serializer.serialize_str("custom"),
        }
    }
}