aboutsummaryrefslogtreecommitdiff
path: root/rprt-engine/src/state.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rprt-engine/src/state.rs')
-rw-r--r--rprt-engine/src/state.rs32
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();