acick_util/model/
sample.rs

1use std::hash::Hash;
2use std::vec::IntoIter;
3
4use getset::Getters;
5use serde::{Deserialize, Serialize};
6
7use crate::Result;
8
9#[derive(Serialize, Deserialize, Getters, Debug, Clone, PartialEq, Eq, Hash)]
10pub struct Sample {
11    #[get = "pub"]
12    name: String,
13    #[get = "pub"]
14    input: String,
15    #[get = "pub"]
16    output: String,
17}
18
19impl Sample {
20    pub fn new(
21        name: impl Into<String>,
22        input: impl Into<String>,
23        output: impl Into<String>,
24    ) -> Self {
25        Self {
26            name: name.into(),
27            input: input.into(),
28            output: output.into(),
29        }
30    }
31
32    pub fn take(self) -> (String, String, String) {
33        (self.name, self.input, self.output)
34    }
35}
36
37pub trait AsSamples: Iterator<Item = Result<Sample>> {
38    fn len(&self) -> usize;
39
40    fn max_name_len(&self) -> usize;
41
42    fn is_empty(&self) -> bool {
43        self.len() == 0
44    }
45}
46
47#[derive(Debug, Clone)]
48pub struct SampleIter {
49    len: usize,
50    max_name_len: usize,
51    iter: IntoIter<Sample>,
52}
53
54impl Iterator for SampleIter {
55    type Item = Result<Sample>;
56
57    fn next(&mut self) -> Option<Result<Sample>> {
58        self.iter.next().map(Ok)
59    }
60}
61
62impl AsSamples for SampleIter {
63    fn len(&self) -> usize {
64        self.len
65    }
66
67    fn max_name_len(&self) -> usize {
68        self.max_name_len
69    }
70}
71
72impl From<Vec<Sample>> for SampleIter {
73    fn from(samples: Vec<Sample>) -> Self {
74        Self {
75            len: samples.len(),
76            max_name_len: samples.iter().map(|s| s.name.len()).max().unwrap_or(0),
77            iter: samples.into_iter(),
78        }
79    }
80}
81
82#[cfg(test)]
83mod tests {
84    use super::*;
85
86    #[test]
87    fn test_sample_iter() {
88        let sample_iter: SampleIter = vec![
89            Sample::new("name 1", "5", "0"),
90            Sample::new("name long long", "5", "0"),
91            Sample::new("name hoge", "5", "0"),
92        ]
93        .into();
94        assert_eq!(sample_iter.len(), 3);
95        assert_eq!(sample_iter.max_name_len(), 14);
96        assert!(!sample_iter.is_empty());
97
98        let sample_iter: SampleIter = Vec::new().into();
99        assert_eq!(sample_iter.len(), 0);
100        assert_eq!(sample_iter.max_name_len(), 0);
101        assert!(sample_iter.is_empty());
102    }
103}