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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
use std::hash::Hash;
use std::vec::IntoIter;
use getset::Getters;
use serde::{Deserialize, Serialize};
use crate::Result;
#[derive(Serialize, Deserialize, Getters, Debug, Clone, PartialEq, Eq, Hash)]
pub struct Sample {
#[get = "pub"]
name: String,
#[get = "pub"]
input: String,
#[get = "pub"]
output: String,
}
impl Sample {
pub fn new(
name: impl Into<String>,
input: impl Into<String>,
output: impl Into<String>,
) -> Self {
Self {
name: name.into(),
input: input.into(),
output: output.into(),
}
}
pub fn take(self) -> (String, String, String) {
(self.name, self.input, self.output)
}
}
pub trait AsSamples: Iterator<Item = Result<Sample>> {
fn len(&self) -> usize;
fn max_name_len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
}
#[derive(Debug, Clone)]
pub struct SampleIter {
len: usize,
max_name_len: usize,
iter: IntoIter<Sample>,
}
impl Iterator for SampleIter {
type Item = Result<Sample>;
fn next(&mut self) -> Option<Result<Sample>> {
self.iter.next().map(Ok)
}
}
impl AsSamples for SampleIter {
fn len(&self) -> usize {
self.len
}
fn max_name_len(&self) -> usize {
self.max_name_len
}
}
impl From<Vec<Sample>> for SampleIter {
fn from(samples: Vec<Sample>) -> Self {
Self {
len: samples.len(),
max_name_len: samples.iter().map(|s| s.name.len()).max().unwrap_or(0),
iter: samples.into_iter(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sample_iter() {
let sample_iter: SampleIter = vec![
Sample::new("name 1", "5", "0"),
Sample::new("name long long", "5", "0"),
Sample::new("name hoge", "5", "0"),
]
.into();
assert_eq!(sample_iter.len(), 3);
assert_eq!(sample_iter.max_name_len(), 14);
assert!(!sample_iter.is_empty());
let sample_iter: SampleIter = Vec::new().into();
assert_eq!(sample_iter.len(), 0);
assert_eq!(sample_iter.max_name_len(), 0);
assert!(sample_iter.is_empty());
}
}