Skip to main content

knowledge_base_crud/entity/statement/
apply.rs

1use super::planner::StatementPlanner;
2use super::{ApplyMode, ApplyStatementsOutcome, StatementBatch, StatementResultStatus, validate_batch};
3use crate::Error;
4use crate::entity::Entities;
5use crate::mutation::{MutationLock, commit, validate_staged};
6use knowledge_base_validation::validate_repository;
7
8impl Entities<'_> {
9    pub fn apply_statements(&self, batch: &StatementBatch, mode: ApplyMode) -> Result<ApplyStatementsOutcome, Error> {
10        validate_batch(batch)?;
11        let _lock = MutationLock::acquire(self.knowledge_base.root())?;
12
13        let baseline = validate_repository(self.knowledge_base.root());
14        if !baseline.is_empty() {
15            return Err(Error::Validation(baseline));
16        }
17
18        let plan = StatementPlanner::new(self.knowledge_base.root(), batch).plan()?;
19        validate_staged(self.knowledge_base.root(), &plan.edits)?;
20
21        if !plan.all_new() {
22            return Ok(ApplyStatementsOutcome::NotApplied(plan.results));
23        }
24        if mode == ApplyMode::Preview {
25            return Ok(ApplyStatementsOutcome::Previewed(plan.results));
26        }
27
28        commit(&plan.edits)?;
29        let mut results = plan.results;
30        for result in &mut results {
31            debug_assert_eq!(result.status, StatementResultStatus::WouldAdd);
32            result.status = StatementResultStatus::Added;
33        }
34        Ok(ApplyStatementsOutcome::Applied(results))
35    }
36}