use std::sync::Arc;
use energyml_core::registry::DynObject;
use energyml_domain::color::GraphicalSet;
use energyml_domain::package_index::PackageIndex;
use energyml_storage::EpcStore;
use crate::read::surfaces::is_cut_type;
use crate::read::{FramesOf, PackageContext};
pub struct Listed<'a> {
pub graphics: Vec<(String, GraphicalSet)>,
pub index: Arc<PackageIndex>,
frames_of: Box<FramesOf<'a>>,
}
impl<'a> Listed<'a> {
pub fn of(store: &'a EpcStore) -> Result<Self, String> {
let mut graphics = Vec::new();
for one in store
.resources()
.iter()
.filter(|one| one.qualified_type.ends_with("GraphicalInformationSet"))
{
let object = store
.get_object(&one.uri)
.map_err(|why| format!("the colour set `{}` does not read: {why}", one.uri))?;
graphics.push((
one.uuid.to_ascii_lowercase(),
GraphicalSet::read(object.as_reflect()),
));
}
let index = Arc::new(PackageIndex::build(store, store.revision()));
let held = Arc::clone(&index);
let frames_of: Box<FramesOf<'a>> =
Box::new(move |wellbore: &str| frames_of_wellbore(store, &held, wellbore));
Ok(Self {
graphics,
index,
frames_of,
})
}
pub fn context(&self) -> PackageContext<'_> {
PackageContext {
graphics: &self.graphics,
frames_of: Some(&*self.frames_of),
index: Some(&self.index),
colour_of: None,
}
}
}
pub fn frames_of_wellbore(store: &EpcStore, index: &PackageIndex, wellbore: &str) -> Vec<Box<dyn DynObject>> {
index
.dependents_of(wellbore)
.into_iter()
.filter(|pointer| pointer.qualified_type.ends_with("WellboreFrameRepresentation"))
.filter_map(|pointer| store.get_object(&pointer.uri).ok())
.collect()
}
pub fn selection(store: &EpcStore) -> (Vec<String>, Vec<String>) {
let resources = store.resources();
let wells = resources
.iter()
.filter(|one| {
one.qualified_type.ends_with("WellboreTrajectoryRepresentation")
|| one.qualified_type.ends_with("WellboreFrameRepresentation")
})
.map(|one| one.uri.clone())
.collect();
let surfaces = resources
.iter()
.filter(|one| is_cut_type(&one.qualified_type))
.map(|one| one.uri.clone())
.collect();
(wells, surfaces)
}