gled 2.1.1

gled is an application for creating animations and effects on artnet or wled light installations
use serde::{Deserialize, Serialize};
use std::ops::AddAssign;

#[derive(Default, Debug, Clone, Copy, Serialize, Deserialize)]
pub struct VariablesCount {
    pub u32: usize,
    pub f32: usize,
}

impl AddAssign for VariablesCount {
    fn add_assign(&mut self, rhs: Self) {
        self.u32 += rhs.u32;
        self.f32 += rhs.f32;
    }
}

impl VariablesCount {
    pub fn possible(&self) -> bool {
        self.u32 <= 3 && self.f32 <= 7
    }
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Variables {
    U32,
    F32,
    Vec2F32,
}

impl Variables {
    pub fn count(&self) -> VariablesCount {
        match self {
            Self::U32 => VariablesCount { u32: 1, f32: 0 },
            Self::F32 => VariablesCount { u32: 0, f32: 1 },
            Self::Vec2F32 => VariablesCount { u32: 0, f32: 2 },
        }
    }

    pub fn function(&self, name: &str) -> String {
        match self {
            Self::U32 => format!("fn {name}() -> u32;"),
            Self::F32 => format!("fn {name}() -> f32;"),
            Self::Vec2F32 => format!("fn {name}() -> vec2<f32>;"),
        }
    }

    pub fn shader_code_for_getter(&self, name: &str, count: VariablesCount) -> String {
        match self {
            Self::U32 => format!(
                r#"
                    fn {name}() -> u32 {{
                        return uniforms.u32_{};
                    }}
                "#,
                count.u32,
            ),
            Self::F32 => format!(
                r#"
                    fn {name}() -> f32 {{
                        return uniforms.f32_{};
                    }}
                "#,
                count.f32
            ),
            Self::Vec2F32 => {
                format!(
                    r#"
                        fn {name}() -> vec2<f32> {{
                            return vec2<f32>(uniforms.f32_{}, uniforms.f32_{});
                        }}
                    "#,
                    count.f32,
                    count.f32 + 1
                )
            }
        }
    }
}