acick_util/model/
sample.rs1use 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}