1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//! Classified iris functionalities.

use derive_more::{Constructor, Deref, DerefMut};
use serde::{Deserialize, Deserializer};
use tabled::Tabled;

use crate::{IrisParams, IrisSpecies, UnclassifiedIris};

/// Classified iris.
///
/// Inherits many functionalities from unclassified iris.
#[derive(Constructor, Clone, Copy, Debug, PartialEq, Deref, DerefMut)]
pub struct ClassifiedIris {
    #[deref]
    #[deref_mut]
    pub parameters: UnclassifiedIris,
    pub classification: IrisSpecies,
}
// CRUD-C: Conversions
impl From<FlatClassifiedIris> for ClassifiedIris {
    fn from(value: FlatClassifiedIris) -> Self {
        let FlatClassifiedIris {
            sepal_length,
            sepal_width,
            petal_length,
            petal_width,
            classification,
        } = value;
        Self {
            parameters: UnclassifiedIris::from([
                sepal_length,
                sepal_width,
                petal_length,
                petal_width,
            ]),
            classification,
        }
    }
}
// CRUD-C: Deserializers
impl<'de> Deserialize<'de> for ClassifiedIris {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        FlatClassifiedIris::deserialize(deserializer).map(Self::from)
    }
}
// CRUD-R: Getters
impl IrisParams for ClassifiedIris {
    fn iris_params(&self) -> &UnclassifiedIris {
        &self.parameters
    }
}
// CRUD-R: Displayers
impl Tabled for ClassifiedIris {
    const LENGTH: usize = <UnclassifiedIris as Tabled>::LENGTH + 1;

    fn fields(&self) -> Vec<std::borrow::Cow<'_, str>> {
        let mut parameters = self.parameters.fields();
        parameters.push(self.classification.as_ref().into());
        parameters
    }

    fn headers() -> Vec<std::borrow::Cow<'static, str>> {
        let mut parameters = <UnclassifiedIris as Tabled>::headers();
        parameters.push("species".into());
        parameters
    }
}

pub use flat::FlatClassifiedIris;
pub mod flat;