Skip to main content

renderbox_sdk/graph/
plan.rs

1use renderbox_dsl::{compile_plan, encode_plan, optimize, OpRegistry, OptimizeOpts};
2use renderbox_executor::execute::{ExecuteOpts, ExecuteResult};
3
4use crate::error;
5
6use super::builder::SharedGraph;
7
8pub struct PlanBuilder {
9    pub(in crate::graph) graph: SharedGraph,
10}
11
12impl PlanBuilder {
13    pub(in crate::graph) fn new(graph: SharedGraph) -> Self {
14        Self { graph }
15    }
16
17    pub fn build(self) -> error::Result<Vec<u8>> {
18        let mut builder = self.graph.borrow_mut();
19        let roots = builder.outputs.clone();
20
21        let roots = optimize(&mut builder.arena, &roots, &OptimizeOpts::default());
22
23        let registry = OpRegistry::builtin();
24        let plan = compile_plan(&mut builder.arena, &roots, &registry).map_err(|d| {
25            error::Error::BuildFailure {
26                message: d.message,
27            }
28        })?;
29
30        Ok(encode_plan(&plan))
31    }
32
33    pub async fn execute(self) -> error::Result<ExecuteResult> {
34        self.execute_with(ExecuteOpts::default()).await
35    }
36
37    pub async fn execute_with(self, opts: ExecuteOpts) -> error::Result<ExecuteResult> {
38        let plan_bytes = self.build()?;
39        let plan = renderbox_executor::decode(&plan_bytes).map_err(|e| {
40            error::Error::ExecuteFailure { source: e }
41        })?;
42        renderbox_executor::execute::execute(&plan, opts)
43            .await
44            .map_err(|e| error::Error::ExecuteFailure { source: e })
45    }
46}