renderbox_sdk/graph/
plan.rs1use 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, ®istry).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}