use std::path::Path;
use super::inspect;
use super::lint::{LintReport, lint};
use super::manifest;
use super::svg::svg_from_ops;
use crate::draw_ops;
use crate::ir::DrawOp;
use crate::layout;
use crate::state::UiState;
use crate::theme::Theme;
use crate::tokens;
use crate::tree::{El, Rect};
#[derive(Clone, Debug)]
#[non_exhaustive]
pub struct Bundle {
pub svg: String,
pub tree_dump: String,
pub draw_ops: Vec<DrawOp>,
pub shader_manifest: String,
pub lint: LintReport,
}
pub fn render_bundle(root: &mut El, viewport: Rect, library_marker: Option<&str>) -> Bundle {
render_bundle_with(root, &mut UiState::new(), viewport, library_marker)
}
pub fn render_bundle_themed(
root: &mut El,
viewport: Rect,
library_marker: Option<&str>,
theme: &Theme,
) -> Bundle {
render_bundle_with_theme(root, &mut UiState::new(), viewport, library_marker, theme)
}
pub fn render_bundle_with(
root: &mut El,
ui_state: &mut UiState,
viewport: Rect,
library_marker: Option<&str>,
) -> Bundle {
render_bundle_with_theme(root, ui_state, viewport, library_marker, &Theme::default())
}
pub fn render_bundle_with_theme(
root: &mut El,
ui_state: &mut UiState,
viewport: Rect,
library_marker: Option<&str>,
theme: &Theme,
) -> Bundle {
layout::layout(root, ui_state, viewport);
let draw_ops = draw_ops::draw_ops_with_theme(root, ui_state, theme);
let svg = svg_from_ops(viewport.w, viewport.h, &draw_ops, tokens::BG_APP);
let tree_dump = inspect::dump_tree(root, ui_state);
let shader_manifest = manifest::shader_manifest(&draw_ops);
let lint = lint(root, ui_state, library_marker);
Bundle {
svg,
tree_dump,
draw_ops,
shader_manifest,
lint,
}
}
pub fn write_bundle(
bundle: &Bundle,
dir: &Path,
name: &str,
) -> std::io::Result<Vec<std::path::PathBuf>> {
std::fs::create_dir_all(dir)?;
let mut written = Vec::new();
let svg = dir.join(format!("{name}.svg"));
std::fs::write(&svg, &bundle.svg)?;
written.push(svg);
let tree = dir.join(format!("{name}.tree.txt"));
std::fs::write(&tree, &bundle.tree_dump)?;
written.push(tree);
let draw_ops_path = dir.join(format!("{name}.draw_ops.txt"));
std::fs::write(&draw_ops_path, manifest::draw_ops_text(&bundle.draw_ops))?;
written.push(draw_ops_path);
let manifest_path = dir.join(format!("{name}.shader_manifest.txt"));
std::fs::write(&manifest_path, &bundle.shader_manifest)?;
written.push(manifest_path);
let lint = dir.join(format!("{name}.lint.txt"));
std::fs::write(&lint, bundle.lint.text())?;
written.push(lint);
Ok(written)
}