use sim_citizen_derive::Citizen;
use sim_kernel::{Expr, Result, Symbol};
use crate::node;
#[derive(Clone, Debug, PartialEq, Citizen)]
#[citizen(symbol = "scene/Scene", version = 1)]
pub struct SceneDescriptor {
#[citizen(with = "scene_expr")]
scene: Expr,
}
impl SceneDescriptor {
pub fn from_expr(scene: Expr) -> Result<Self> {
scene_expr::decode(&scene)?;
Ok(Self { scene })
}
pub fn as_expr(&self) -> &Expr {
&self.scene
}
}
impl Default for SceneDescriptor {
fn default() -> Self {
Self::from_expr(node(
"text",
vec![("text", Expr::String("citizen scene".to_owned()))],
))
.expect("default scene descriptor should be valid")
}
}
pub fn scene_descriptor_class_symbol() -> Symbol {
Symbol::qualified("scene", "Scene")
}
pub(crate) mod scene_expr {
use sim_kernel::{Error, Expr, Result};
use crate::validate_scene;
pub fn encode(expr: &Expr) -> Expr {
expr.clone()
}
pub fn decode(expr: &Expr) -> Result<Expr> {
validate_scene(expr).map_err(|error| Error::Eval(format!("malformed scene: {error}")))?;
Ok(expr.clone())
}
}