trellis_core/
resource_build.rs1use crate::{
2 CollectionNode, GraphError, GraphResult, MapDiff, PlanContext, PlanError, ResourcePlan,
3 SetDiff, Transaction, resource::ResourcePlanner,
4};
5
6impl<C: 'static, O> Transaction<'_, C, O>
7where
8 O: Clone + PartialEq + 'static,
9{
10 pub fn map_resource_planner<K, V>(
12 &mut self,
13 collection: CollectionNode<K, V>,
14 scope: crate::ScopeId,
15 planner: impl for<'ctx> Fn(
16 &PlanContext<'ctx, MapDiff<K, V>>,
17 ) -> Result<ResourcePlan<C>, PlanError>
18 + 'static,
19 ) -> GraphResult<()>
20 where
21 K: Clone + Ord + 'static,
22 V: Clone + PartialEq + 'static,
23 {
24 self.ensure_open()?;
25 self.working.require_scope_open(scope)?;
26 self.working
27 .validate_map_collection_read::<K, V>(collection.id())?;
28 let resource_planner = ResourcePlanner::new(collection.id(), scope, move |graph| {
29 let Some(diff) = graph.map_diff(collection)? else {
30 return Ok(ResourcePlan::new());
31 };
32 let ctx = PlanContext::new(scope, diff);
33 planner(&ctx).map_err(|error| GraphError::PlanFailed(scope, error))
34 });
35 self.staged_resource_planner_collections
36 .push(collection.id());
37 self.working.resource_planners.push(resource_planner);
38 self.graph_mutated = true;
39 Ok(())
40 }
41
42 pub fn set_resource_planner<K>(
44 &mut self,
45 collection: CollectionNode<K, ()>,
46 scope: crate::ScopeId,
47 planner: impl for<'ctx> Fn(&PlanContext<'ctx, SetDiff<K>>) -> Result<ResourcePlan<C>, PlanError>
48 + 'static,
49 ) -> GraphResult<()>
50 where
51 K: Clone + Ord + 'static,
52 {
53 self.ensure_open()?;
54 self.working.require_scope_open(scope)?;
55 self.working
56 .validate_set_collection_read::<K>(collection.id())?;
57 let resource_planner = ResourcePlanner::new(collection.id(), scope, move |graph| {
58 let Some(diff) = graph.set_diff(collection)? else {
59 return Ok(ResourcePlan::new());
60 };
61 let ctx = PlanContext::new(scope, diff);
62 planner(&ctx).map_err(|error| GraphError::PlanFailed(scope, error))
63 });
64 self.staged_resource_planner_collections
65 .push(collection.id());
66 self.working.resource_planners.push(resource_planner);
67 self.graph_mutated = true;
68 Ok(())
69 }
70}