1use 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#[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}
21impl 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}
42impl<'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}
51impl IrisParams for ClassifiedIris {
53 fn iris_params(&self) -> &UnclassifiedIris {
54 &self.parameters
55 }
56}
57impl 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;