tawasuyu/llimphi
Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.
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}