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
|
use std::path::PathBuf;
use crate::defaults;
use crate::selectors::{SelectFilters,daterange::SelectFilterFrom,daterange::SelectFilterTo};
use crate::utils::fileutil as utils;
use crate::khline::KhLine;
use crate::KhResult;
impl SelectFilters {
fn predicate_path_skip_while(&self) -> impl Fn(&PathBuf) -> bool + '_ {
move |path| {
let bucketname = match path.file_name() {
Some(path_os_str) => path_os_str.to_string_lossy(),
None => panic!("{:?} not a file", path),
};
self.from.is_bucket_before(&bucketname)
}
}
fn predicate_path_take_while<'a>(&'a self) -> impl Fn(&PathBuf) -> bool + 'a {
move |path| {
let bucketname = match path.file_name() {
Some(path_os_str) => path_os_str.to_string_lossy(),
None => panic!("{:?} not a file", path),
};
self.to.is_bucket_while(&bucketname)
}
}
}
impl SelectFilterFrom {
fn is_bucket_before(&self, bucketname: &str) -> bool {
self.bucket.as_ref().map_or(false, |bucket| bucketname < bucket)
}
}
impl SelectFilterTo {
fn is_bucket_while(&self, bucketname: &str) -> bool {
self.bucket.as_ref().map_or(true, |bucket| bucketname <= bucket)
}
}
pub fn select_by_args(args: &[&str]) -> KhResult<()> {
let filters = SelectFilters::parse_from_args(args)?;
let indexdir = defaults::get_indexdir();
let mut buckets: Vec<PathBuf> = utils::file_iter(&indexdir)
.collect();
buckets.sort_unstable();
let buckets = buckets.into_iter()
.skip_while(filters.predicate_path_skip_while())
.take_while(filters.predicate_path_take_while());
let cals = buckets.map(|bucket| utils::read_lines_from_file(&bucket))
.filter_map(|lines| lines.ok())
.flatten()
.map(|line| line.parse::<KhLine>())
.filter_map(|cal| cal.ok())
.map(|khline| khline.to_event())
.flatten()
;
let mut lines: Vec<String> = cals
.filter(|event| filters.is_selected(event))
.map(|event| KhLine::from(&event))
.map(|khline| khline.to_string())
.collect();
lines.sort_unstable();
lines.dedup();
for line in lines {
println!("{}", line);
}
Ok(())
}
|