use crate::core::log::{Log, LogView};
use crate::foundation::Result;
use std::path::Path;
#[derive(Debug, Clone, PartialEq)]
pub struct Top {
pub name: String,
pub md: f64,
}
impl Top {
pub fn new(name: impl Into<String>, md: f64) -> Top {
Top {
name: name.into(),
md,
}
}
pub fn load_csv(path: impl AsRef<Path>, name_col: &str, md_col: &str) -> Result<Vec<Top>> {
let recs = crate::io::tops::load(path.as_ref(), name_col, md_col)?;
Ok(recs.into_iter().map(|r| Top::new(r.name, r.md)).collect())
}
}
#[derive(Debug, Clone)]
pub struct Interval<'a> {
pub name: String,
pub top_md: f64,
pub base_md: f64,
logs: &'a [Log],
}
impl<'a> Interval<'a> {
pub(crate) fn new(name: String, top_md: f64, base_md: f64, logs: &'a [Log]) -> Interval<'a> {
Interval {
name,
top_md,
base_md,
logs,
}
}
pub fn log(&self, mnemonic: &str) -> Option<LogView<'a>> {
let log = self
.logs
.iter()
.find(|l| l.mnemonic.eq_ignore_ascii_case(mnemonic))?;
Some(log.clip(self.top_md, self.base_md))
}
pub fn thickness_md(&self) -> f64 {
self.base_md - self.top_md
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn thickness_is_base_minus_top() {
let i = Interval::new("Brent".into(), 2400.0, 2480.0, &[]);
assert_eq!(i.thickness_md(), 80.0);
}
}