Skip to main content

knowledge_base_crud/write/statements/
apply.rs

1use super::planner::StatementPlanner;
2use super::{ApplyStatementsOutcome, StatementBatch, StatementResultStatus, validate_batch};
3use crate::Error;
4use crate::write::execution::{MutationDisposition, PlannedMutation, execute};
5use crate::write::{StatementMutations, WriteMode};
6
7impl StatementMutations<'_> {
8    pub fn apply(&self, batch: &StatementBatch, mode: WriteMode) -> Result<ApplyStatementsOutcome, Error> {
9        validate_batch(batch)?;
10        let (mut results, disposition) = execute(self.repository, mode, || {
11            let plan = StatementPlanner::new(self.repository.root(), batch).plan()?;
12            let can_commit = plan.all_new();
13            Ok(PlannedMutation::new(plan.results, plan.edits, can_commit))
14        })?;
15        match disposition {
16            MutationDisposition::NotCommitted => Ok(ApplyStatementsOutcome::NotApplied(results)),
17            MutationDisposition::Previewed => Ok(ApplyStatementsOutcome::Previewed(results)),
18            MutationDisposition::Committed => {
19                for result in &mut results {
20                    debug_assert_eq!(result.status, StatementResultStatus::WouldAdd);
21                    result.status = StatementResultStatus::Added;
22                }
23                Ok(ApplyStatementsOutcome::Applied(results))
24            }
25        }
26    }
27}