knowledge-base-crud 0.2.0

Filesystem CRUD operations for a file-based knowledge base
Documentation
use super::planner::StatementPlanner;
use super::{ApplyMode, ApplyStatementsOutcome, StatementBatch, StatementResultStatus, validate_batch};
use crate::Error;
use crate::entity::Entities;
use crate::mutation::{MutationLock, commit, validate_staged};

impl Entities<'_> {
    pub fn apply_statements(&self, batch: &StatementBatch, mode: ApplyMode) -> Result<ApplyStatementsOutcome, Error> {
        validate_batch(batch)?;
        let _lock = MutationLock::acquire(self.knowledge_base.root())?;

        let baseline = self.knowledge_base.validate();
        if !baseline.is_empty() {
            return Err(Error::Validation(baseline));
        }

        let plan = StatementPlanner::new(self.knowledge_base.root(), batch).plan()?;
        validate_staged(self.knowledge_base.root(), &plan.edits, self.knowledge_base.additional_validators())?;

        if !plan.all_new() {
            return Ok(ApplyStatementsOutcome::NotApplied(plan.results));
        }
        if mode == ApplyMode::Preview {
            return Ok(ApplyStatementsOutcome::Previewed(plan.results));
        }

        commit(&plan.edits)?;
        let mut results = plan.results;
        for result in &mut results {
            debug_assert_eq!(result.status, StatementResultStatus::WouldAdd);
            result.status = StatementResultStatus::Added;
        }
        Ok(ApplyStatementsOutcome::Applied(results))
    }
}