mix 0.2.1

mix - a rust ui library cooked up in half a day! (expect extra salt)
use crate::platform::shader::{Shader, ShaderId};
use crate::platform::Cx;

pub struct ShaderBuilder {
    vertex_shader: String,
    fragment_shader: String,
    uniforms: Vec<(String, crate::platform::shader::ShaderUniformType)>,
}

impl ShaderBuilder {
    pub fn new() -> Self {
        Self {
            vertex_shader: String::new(),
            fragment_shader: String::new(),
            uniforms: Vec::new(),
        }
    }

    pub fn vertex_shader(mut self, source: &str) -> Self {
        self.vertex_shader = source.to_string();
        self
    }

    pub fn fragment_shader(mut self, source: &str) -> Self {
        self.fragment_shader = source.to_string();
        self
    }

    pub fn uniform(mut self, name: &str, uniform_type: crate::platform::shader::ShaderUniformType) -> Self {
        self.uniforms.push((name.to_string(), uniform_type));
        self
    }

    pub fn build(self, cx: &mut Cx) -> ShaderId {
        let shader_id = cx.create_shader();
        let mut shader = Shader::new(shader_id);

        shader.set_vertex_shader(&self.vertex_shader);
        shader.set_fragment_shader(&self.fragment_shader);

        for (name, uniform_type) in self.uniforms {
            shader.add_uniform(&name, uniform_type);
        }

        cx.shaders.insert(shader_id, shader);

        shader_id
    }
}