Skip to main content

trellis_core/
resource_build.rs

1use 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    /// Stages a map-diff resource planner.
11    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    /// Stages a set-diff resource planner.
43    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}