shadertoy-cli 2.1.3

Agent-friendly ShaderToy project, rendering, debugging, and live-preview CLI
use serde::Deserialize;

#[derive(Debug, Deserialize)]
pub struct ShaderToyEntry {
    #[serde(default)]
    pub info: ShaderInfo,
    #[serde(default)]
    pub renderpass: Vec<RenderPass>,
}

#[derive(Debug, Default, Deserialize)]
pub struct ShaderInfo {
    #[serde(default)]
    pub name: String,
    #[serde(default)]
    pub username: String,
    #[serde(default)]
    pub description: String,
}

#[derive(Debug, Clone, Deserialize)]
pub struct RenderPass {
    #[serde(default)]
    pub name: String,
    #[serde(rename = "type", default)]
    pub kind: String,
    #[serde(default)]
    pub code: String,
    #[serde(default)]
    pub inputs: Vec<ShaderInput>,
    #[serde(default)]
    pub outputs: Vec<ShaderOutput>,
}

#[derive(Debug, Clone, Deserialize)]
pub struct ShaderInput {
    #[serde(default)]
    pub id: String,
    #[serde(rename = "type", default)]
    pub kind: String,
    #[serde(default)]
    pub channel: u8,
    #[serde(default)]
    pub filepath: String,
    #[serde(default)]
    pub sampler: Sampler,
}

#[derive(Debug, Clone, Default, Deserialize)]
pub struct Sampler {
    #[serde(default = "default_filter")]
    pub filter: String,
    #[serde(default = "default_wrap")]
    pub wrap: String,
    #[serde(default)]
    pub vflip: String,
}

#[derive(Debug, Clone, Deserialize)]
pub struct ShaderOutput {
    #[serde(default)]
    pub id: String,
    #[serde(default)]
    pub channel: Option<u8>,
}

fn default_filter() -> String {
    "linear".into()
}

fn default_wrap() -> String {
    "repeat".into()
}