use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct StylePreset {
pub id: String,
pub display_name: String,
pub author: String,
pub version: u32,
pub family: PresetFamily,
pub description: String,
pub llm_image_gen: LlmImageGen,
pub expressions: Vec<ExpressionDef>,
pub renderer: RendererConfig,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum PresetFamily {
Chibi,
Pixel,
Live2d,
Polaroid,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct LlmImageGen {
pub base_prompt: String,
pub negative_prompt: String,
pub size: String,
pub steps: u32,
#[serde(default)]
pub img2img: bool,
#[serde(default)]
pub requires_source_image: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ExpressionDef {
pub id: String,
pub prompt_suffix: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RendererConfig {
pub family: PresetFamily,
pub default_size: SizeConfig,
pub idle_animation: IdleAnimation,
pub blink_interval_s: [f32; 2],
pub crossfade_ms: u32,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub struct SizeConfig {
pub w: u32,
pub h: u32,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum IdleAnimation {
Breathe,
None,
}