#[cfg(feature = "payload-encryption")]
use crate::event::EventKind;
use crate::event::{Event, JsonValueInput, ProjectionInput, RawMsgpackInput};
use crate::store::index::DiskPos;
use crate::store::StoreError;
#[doc(hidden)]
pub trait ReplayInput: ProjectionInput {
fn read_batch(
reader: &crate::store::segment::scan::Reader,
positions: &[&DiskPos],
) -> Result<Vec<Event<Self::Payload>>, StoreError>;
fn read_one(
reader: &crate::store::segment::scan::Reader,
pos: &DiskPos,
) -> Result<Event<Self::Payload>, StoreError>;
#[cfg(feature = "payload-encryption")]
fn payload_from_plaintext_bytes(
bytes: Vec<u8>,
event_kind: EventKind,
) -> Result<Self::Payload, StoreError>;
}
impl ReplayInput for JsonValueInput {
fn read_batch(
reader: &crate::store::segment::scan::Reader,
positions: &[&DiskPos],
) -> Result<Vec<Event<Self::Payload>>, StoreError> {
reader.read_events_batch(positions)
}
fn read_one(
reader: &crate::store::segment::scan::Reader,
pos: &DiskPos,
) -> Result<Event<Self::Payload>, StoreError> {
reader.read_event_only(pos)
}
#[cfg(feature = "payload-encryption")]
fn payload_from_plaintext_bytes(
bytes: Vec<u8>,
event_kind: EventKind,
) -> Result<Self::Payload, StoreError> {
match event_kind {
EventKind::SYSTEM_BATCH_BEGIN | EventKind::SYSTEM_BATCH_COMMIT => {
Ok(serde_json::Value::Null)
}
_ => crate::encoding::from_bytes(&bytes)
.map_err(|error| StoreError::Serialization(Box::new(error))),
}
}
}
impl ReplayInput for RawMsgpackInput {
fn read_batch(
reader: &crate::store::segment::scan::Reader,
positions: &[&DiskPos],
) -> Result<Vec<Event<Self::Payload>>, StoreError> {
reader.read_raw_events_batch(positions)
}
fn read_one(
reader: &crate::store::segment::scan::Reader,
pos: &DiskPos,
) -> Result<Event<Self::Payload>, StoreError> {
reader.read_event_raw_only(pos)
}
#[cfg(feature = "payload-encryption")]
fn payload_from_plaintext_bytes(
bytes: Vec<u8>,
_event_kind: EventKind,
) -> Result<Self::Payload, StoreError> {
Ok(bytes)
}
}