use std::collections::HashMap;
use std::path::{Path, PathBuf};
use crate::common::universal_io::{UniversalReadFs, read_json_via};
use crate::segment::common::operation_error::OperationResult;
use crate::shard::files::{SEGMENTS_PATH, segment_manifest_path};
use crate::shard::segment_manifest::SegmentsManifest;
use uuid::Uuid;
use crate::edge::edge_shard::scan_segment_dirs;
pub trait SegmentEnumerator: Send + Sync {
fn list_segments(&self) -> OperationResult<HashMap<Uuid, PathBuf>>;
}
pub struct ManifestSegmentEnumerator<F: UniversalReadFs> {
fs: F,
manifest_path: PathBuf,
segments_path: PathBuf,
}
impl<F: UniversalReadFs> ManifestSegmentEnumerator<F> {
pub fn new(fs: F, shard_path: &Path) -> Self {
Self {
fs,
manifest_path: segment_manifest_path(shard_path),
segments_path: shard_path.join(SEGMENTS_PATH),
}
}
}
impl<F: UniversalReadFs + Send + Sync> SegmentEnumerator for ManifestSegmentEnumerator<F> {
fn list_segments(&self) -> OperationResult<HashMap<Uuid, PathBuf>> {
let manifest: SegmentsManifest = read_json_via(&self.fs, &self.manifest_path)?;
Ok(manifest
.iter()
.filter(|(_, state)| state.is_usable())
.map(|(uuid, _)| (*uuid, self.segments_path.join(uuid.to_string())))
.collect())
}
}
pub struct LocalSegmentEnumerator {
segments_path: PathBuf,
}
impl LocalSegmentEnumerator {
pub fn new(shard_path: &std::path::Path) -> Self {
Self {
segments_path: shard_path.join(SEGMENTS_PATH),
}
}
}
impl SegmentEnumerator for LocalSegmentEnumerator {
fn list_segments(&self) -> OperationResult<HashMap<Uuid, PathBuf>> {
scan_segment_dirs(&self.segments_path)
}
}