#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RockGroupCode {
Single,
Interbedded,
Mixed,
}
impl RockGroupCode {
pub fn from_code(code: &str) -> Option<Self> {
match code {
"1" => Some(Self::Single),
"2" => Some(Self::Interbedded),
"3" => Some(Self::Mixed),
_ => None,
}
}
pub fn is_interbedded(&self) -> bool {
*self == Self::Interbedded
}
}
#[derive(Debug, Clone)]
pub enum Constituent {
Named {
name: String,
symbol: Option<String>,
},
Coded {
lithofacies: Option<String>,
rock: Option<String>,
metamorphic_rock_lithofacies: Option<String>,
metamorphic_rock: Option<String>,
},
}
#[derive(Debug, Clone)]
pub struct RockGroupInfo {
pub code: RockGroupCode,
pub constituents: Vec<Constituent>,
}
pub trait ClassificationInfo {
fn rock_groups(&self) -> Vec<RockGroupInfo>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_rock_group_code_from_code() {
assert_eq!(RockGroupCode::from_code("1"), Some(RockGroupCode::Single));
assert_eq!(
RockGroupCode::from_code("2"),
Some(RockGroupCode::Interbedded)
);
assert_eq!(RockGroupCode::from_code("3"), Some(RockGroupCode::Mixed));
assert_eq!(RockGroupCode::from_code("4"), None);
assert_eq!(RockGroupCode::from_code(""), None);
}
#[test]
fn test_rock_group_code_is_interbedded() {
assert!(!RockGroupCode::Single.is_interbedded());
assert!(RockGroupCode::Interbedded.is_interbedded());
assert!(!RockGroupCode::Mixed.is_interbedded());
}
}