pub mod assemble;
pub mod crosses;
pub mod erosion;
pub mod inputs;
pub mod layout;
pub mod markers;
pub mod model;
pub mod paint;
pub mod panels;
pub mod png;
pub mod read;
pub mod spatial;
pub mod style;
pub mod svg;
use crate::inputs::InputsError;
use crate::model::{Asked, Catalogue, Contribution, Inputs, SectionTrace, View};
pub fn compute(
inputs: &Inputs,
mut read_one: impl FnMut(&Asked, &[SectionTrace]) -> Contribution,
) -> Result<Catalogue, InputsError> {
let (sections, _) = crosses::traces(inputs)?;
let contributions: Vec<Contribution> = inputs
.objects
.iter()
.map(|asked| read_one(asked, §ions))
.collect();
assemble::assemble(inputs, &contributions)
}
pub struct Opened<'a> {
pub store: String,
pub source: &'a dyn energyml_domain::ArraySource,
pub context: read::PackageContext<'a>,
pub cache: Option<&'a mut read::PackageCache>,
}
pub fn compute_packages(
inputs: &Inputs,
packages: &mut [Opened<'_>],
reprojector: &dyn energyml_domain::reproject::Reprojector,
) -> Result<Catalogue, InputsError> {
let scene = read::Scene {
system: inputs.system.as_ref(),
time_factor: inputs.time_factor,
reprojector,
};
compute(inputs, |asked, sections| {
match packages.iter_mut().find(|one| one.store == asked.store) {
Some(opened) => {
let mut thrown = read::PackageCache::new();
let cache = opened.cache.as_deref_mut().unwrap_or(&mut thrown);
read::contribution_cached(opened.source, asked, sections, &scene, &opened.context, cache)
}
None => not_open(asked),
}
})
}
fn not_open(asked: &Asked) -> Contribution {
let refused = asked
.wells
.iter()
.chain(&asked.surfaces)
.map(|uri| model::Refused {
object: model::ObjectId {
store: asked.store.clone(),
uri: uri.clone(),
uuid: read::surfaces::uuid_of_uri(uri),
title: String::new(),
qualified_type: String::new(),
},
reason: format!(
"the package `{}` this object was asked from is not open",
asked.store
),
})
.collect();
Contribution {
store: asked.store.clone(),
refused,
..Contribution::default()
}
}
#[derive(Debug, Clone, PartialEq, thiserror::Error)]
pub enum RedrawError {
#[error(transparent)]
Metadata(#[from] svg::MetadataError),
#[error(transparent)]
Inputs(#[from] InputsError),
}
pub fn redraw(
svg: &str,
packages: &mut [Opened<'_>],
reprojector: &dyn energyml_domain::reproject::Reprojector,
) -> Result<String, RedrawError> {
let metadata = svg::read_metadata(svg)?;
let catalogue = compute_packages(&metadata.inputs, packages, reprojector)?;
Ok(draw(&catalogue, &metadata.view))
}
pub fn draw(catalogue: &Catalogue, view: &View) -> String {
svg::write(&layout::layout(catalogue, view))
}