ic/iris/
classified.rs

1//! Classified iris functionalities.
2
3use std::borrow::Cow;
4
5use derive_more::{Constructor, Deref, DerefMut};
6use serde::{Deserialize, Deserializer};
7use tabled::Tabled;
8
9use crate::{IrisParams, IrisSpecies, UnclassifiedIris};
10
11/// Classified iris.
12///
13/// Inherits many functionalities from unclassified iris.
14#[derive(Constructor, Clone, Copy, Debug, PartialEq, Deref, DerefMut)]
15pub struct ClassifiedIris {
16    #[deref]
17    #[deref_mut]
18    pub parameters: UnclassifiedIris,
19    pub classification: IrisSpecies,
20}
21// CRUD-C: Conversions
22impl From<FlatClassifiedIris> for ClassifiedIris {
23    fn from(value: FlatClassifiedIris) -> Self {
24        let FlatClassifiedIris {
25            sepal_length,
26            sepal_width,
27            petal_length,
28            petal_width,
29            classification,
30        } = value;
31        Self {
32            parameters: UnclassifiedIris::from([
33                sepal_length,
34                sepal_width,
35                petal_length,
36                petal_width,
37            ]),
38            classification,
39        }
40    }
41}
42// CRUD-C: Deserializers
43impl<'de> Deserialize<'de> for ClassifiedIris {
44    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
45    where
46        D: Deserializer<'de>,
47    {
48        FlatClassifiedIris::deserialize(deserializer).map(Self::from)
49    }
50}
51// CRUD-R: Getters
52impl IrisParams for ClassifiedIris {
53    fn iris_params(&self) -> &UnclassifiedIris {
54        &self.parameters
55    }
56}
57// CRUD-R: Displayers
58impl Tabled for ClassifiedIris {
59    const LENGTH: usize = FlatClassifiedIris::LENGTH;
60
61    fn headers() -> Vec<Cow<'static, str>> {
62        FlatClassifiedIris::headers()
63    }
64
65    fn fields(&self) -> Vec<Cow<'_, str>> {
66        FlatClassifiedIris::from(*self)
67            .fields()
68            .into_iter()
69            .map(Cow::into_owned)
70            .map(Cow::from)
71            .collect()
72    }
73}
74
75pub use flat::FlatClassifiedIris;
76pub mod flat;