automerge/rust/automerge/src/columnar/splice_error.rs
Alex Good dd3c6d1303
Move rust workspace into ./rust
After some discussion with PVH I realise that the repo structure in the
last reorg was very rust-centric. In an attempt to put each language on
a level footing move the rust code and project files into ./rust
2022-10-16 19:55:51 +01:00

47 lines
1.6 KiB
Rust

use std::convert::Infallible;
/// Represents an error which occurred when splicing.
///
/// When splicing values into existing column storage there are two kinds of errors which can
/// occur, those caused by iterating over the existing items, and those caused by iterating over
/// the replacement items.
#[derive(Debug)]
pub(crate) enum SpliceError<E, R> {
/// There was an error reading from the existing column storage
ReadExisting(E),
/// There was an error reading from the iterator of new rows
ReadReplace(R),
}
impl<E> SpliceError<E, Infallible> {
/// Map a spliceerror which is infallible in it's `Replace` error type into a different error.
///
/// This is used when you have performed a splice with a `replace` iterator which is
/// infallible and need to return a more general `SpliceError`
pub(crate) fn existing<R>(self) -> SpliceError<E, R> {
match self {
SpliceError::ReadExisting(e) => SpliceError::ReadExisting(e),
SpliceError::ReadReplace(_) => unreachable!("absurd"),
}
}
}
impl<E, R> std::error::Error for SpliceError<E, R>
where
E: std::error::Error,
R: std::error::Error,
{
}
impl<E, R> std::fmt::Display for SpliceError<E, R>
where
E: std::fmt::Display,
R: std::fmt::Display,
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::ReadExisting(e) => write!(f, "error reading from existing rows: {}", e),
Self::ReadReplace(e) => write!(f, "error reading from replacement rows: {}", e),
}
}
}