Skip to main content

konjure_wasm/
interchange.rs

1//! Browser file and Blender scene exchange through the shared Rust contract.
2use konjure_sdk::{
3    EntityId, Mesh, SceneDocument,
4    interchange::{MAX_BUNDLE_BYTES, SceneBundle},
5};
6use serde::Deserialize;
7use std::collections::BTreeMap;
8use wasm_bindgen::prelude::*;
9
10/// Validates a bundle and produces a bounded editable language source project.
11#[wasm_bindgen]
12pub fn scene_bundle_to_sources(input: &str) -> Result<String, JsValue> {
13    let bundle = konjure_lang::interchange::parse_bundle(input).map_err(super::json_error)?;
14    let sources = konjure_lang::interchange::to_sources(&bundle).map_err(super::json_error)?;
15    super::encode(&sources)
16}
17
18/// Packages an accepted language render output, excluding UI and telemetry.
19#[wasm_bindgen]
20pub fn scene_bundle_from_render(input: &str, title: &str) -> Result<String, JsValue> {
21    if input.len() > MAX_BUNDLE_BYTES {
22        return Err(super::json_error("render output exceeds 8 MiB"));
23    }
24    #[derive(Deserialize)]
25    struct Render {
26        document: SceneDocument,
27        meshes: BTreeMap<EntityId, Mesh>,
28    }
29    let mut render: Render = serde_json::from_str(input).map_err(super::json_error)?;
30    render.document.title = title.into();
31    render.document.conversation.clear();
32    let bundle = SceneBundle::new(render.document, render.meshes).map_err(super::json_error)?;
33    let encoded = super::encode(&bundle)?;
34    if encoded.len() > MAX_BUNDLE_BYTES {
35        return Err(super::json_error("scene bundle exceeds 8 MiB"));
36    }
37    Ok(encoded)
38}