use std::sync::Arc;
use crate::content::template::Template;
use crate::error::Result;
use crate::segment::identifier::SegmentIdentifier;
use crate::segment::record::RecordIdentifier;
use crate::segment::view::SegmentView;
pub trait SegmentProvider {
fn segment(&self, segment_identifier: SegmentIdentifier) -> Result<SegmentView<'_>>;
fn string(&self, record_identifier: RecordIdentifier) -> Result<Arc<str>>;
fn template(&self, record_identifier: RecordIdentifier) -> Result<Arc<Template>>;
}
#[cfg(test)]
pub(crate) mod tests {
use std::collections::HashMap;
use std::sync::Arc;
use super::SegmentProvider;
use crate::content::template::{Template, read_template};
use crate::content::value::read_string;
use crate::error::{Error, Result};
use crate::segment::identifier::SegmentIdentifier;
use crate::segment::parsed_segment::ParsedSegment;
use crate::segment::record::RecordIdentifier;
use crate::segment::view::SegmentView;
#[derive(Default)]
pub(crate) struct MemorySegmentProvider {
segments: HashMap<SegmentIdentifier, (Arc<ParsedSegment>, Vec<u8>)>,
}
impl MemorySegmentProvider {
pub(crate) fn insert(&mut self, identifier: SegmentIdentifier, bytes: Vec<u8>) {
let structure =
Arc::new(ParsedSegment::parse(identifier, &bytes).expect("valid test segment"));
self.segments.insert(identifier, (structure, bytes));
}
}
impl SegmentProvider for MemorySegmentProvider {
fn segment(&self, segment_identifier: SegmentIdentifier) -> Result<SegmentView<'_>> {
let (structure, bytes) = self
.segments
.get(&segment_identifier)
.ok_or(Error::SegmentNotFound { segment_identifier })?;
Ok(SegmentView {
structure: Arc::clone(structure),
bytes: bytes.as_slice().into(),
})
}
fn string(&self, record_identifier: RecordIdentifier) -> Result<Arc<str>> {
read_string(self, record_identifier).map(Arc::from)
}
fn template(&self, record_identifier: RecordIdentifier) -> Result<Arc<Template>> {
read_template(self, record_identifier).map(Arc::new)
}
}
}