tawasuyu

tawasuyu/llimphi

Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.

Rust 660Markdown 302TOML 157RON 312382 Sutichaykuna

⎇ main llimphi-anim-studio/src/lib.rs Rust · 45 siq'ikuna · 1.7 KB Ñawpa willay Pi imata llamkarqan ch'uya

chore: refresco desde el monorepo — 27 crates nuevos (anim, lottie, svg, mesh, image, layer, test, wire-view, widgets rag-sidebar/router/lazy-list/rive-button) y sync de los 95 existentes 93253cc22 · Sergio ·

1//! Biblioteca del studio de animación «rive»: los documentos **serializables**
2//! que el editor autora —el grafo de estados ([`doc::Doc`]) y el rig esqueletal
3//! ([`rig::RigDoc`])— y el [`Project`] que los junta en el `.ron` que se guarda
4//! y se lee.
5//!
6//! Antes estos tipos vivían dentro del binario del editor; exponerlos como
7//! biblioteca permite que **otros consumidores** carguen el mismo formato sin
8//! duplicar los structs. El primero es `mirada-fondo`, que reproduce un proyecto
9//! como **fondo** (splash/greeter/wallpaper): bakea el rig deformado a frames y
10//! los blitea. El editor (`main.rs`) es ahora un frontend más sobre esta lib.
11
12#![forbid(unsafe_code)]
13
14pub mod doc;
15pub mod rig;
16
17use serde::{Deserialize, Serialize};
18
19/// El proyecto persistido: ambas superficies juntas en un solo `.ron` (el grafo
20/// de estados + el rig esqueletal). Es el formato que escribe el editor y el que
21/// carga `mirada-fondo` para reproducir un «rive» como fondo.
22#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
23pub struct Project {
24    pub doc: doc::Doc,
25    #[serde(default = "rig::RigDoc::starter")]
26    pub rig: rig::RigDoc,
27}
28
29impl Default for Project {
30    fn default() -> Self {
31        Project {
32            doc: doc::Doc::starter(),
33            rig: rig::RigDoc::starter(),
34        }
35    }
36}
37
38impl Project {
39    /// Carga y parsea un proyecto `.ron` de disco.
40    pub fn load(path: impl AsRef<std::path::Path>) -> Result<Self, String> {
41        let p = path.as_ref();
42        let s = std::fs::read_to_string(p).map_err(|e| format!("no se pudo leer {p:?}: {e}"))?;
43        ron::from_str(&s).map_err(|e| format!("RON inválido en {p:?}: {e}"))
44    }
45}