diff options
Diffstat (limited to 'rprt-engine/src/state.rs')
| -rw-r--r-- | rprt-engine/src/state.rs | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/rprt-engine/src/state.rs b/rprt-engine/src/state.rs index 80b5e86..7ef5a19 100644 --- a/rprt-engine/src/state.rs +++ b/rprt-engine/src/state.rs @@ -4,6 +4,7 @@ use crate::{ }; use std::collections::{HashMap, HashSet}; use std::path::PathBuf; +use thiserror::Error; #[derive(Debug, Clone)] pub enum StateChange { @@ -23,19 +24,19 @@ pub enum StateChange { }, } -#[derive(Debug, Clone)] +#[derive(Error, Debug, Clone)] pub enum GroupedChangeError { + #[error("Changes for buffer ID {buffer} overlap in regions {first:#?} and {second:#?}")] OverlappingChanges { buffer: BufferID, first: (usize, usize), second: (usize, usize), }, - BufferNotLive { - buffer: BufferID, - }, - BufferAlreadyExists { - buffer: BufferID, - }, + #[error("Buffer ID {buffer} does not exist at time of processing")] + BufferNotLive { buffer: BufferID }, + #[error("Buffer ID {buffer} already exists at time of processing")] + BufferAlreadyExists { buffer: BufferID }, + #[error("Inconsistent final buffer set")] InconsistentFinalBufferSet, } @@ -154,14 +155,14 @@ impl EditorState { } } - pub fn commit_changes_grouped( - &mut self, - arms: Vec<Vec<StateChange>>, + pub fn validate_grouped_changes( + &self, + arms: &Vec<Vec<StateChange>>, ) -> Result<(), GroupedChangeError> { let initial_buffers: std::collections::HashSet<BufferID> = self.buffers.keys().copied().collect(); - self.validate_arms_buffer_liveness(&arms, &initial_buffers)?; + self.validate_arms_buffer_liveness(arms, &initial_buffers)?; let all_modifications: Vec<&StateChange> = arms .iter() @@ -171,6 +172,15 @@ impl EditorState { Self::validate_modifications(&all_modifications)?; + Ok(()) + } + + pub fn commit_changes_grouped( + &mut self, + arms: Vec<Vec<StateChange>>, + ) -> Result<(), GroupedChangeError> { + self.validate_grouped_changes(&arms)?; + let all_changes: Vec<StateChange> = arms.into_iter().flatten().collect(); let mut creates = Vec::new(); |
