Skip to content

Commit

Permalink
b: fix list date range
Browse files Browse the repository at this point in the history
  • Loading branch information
bouzuya committed Jun 8, 2021
1 parent 74f97b0 commit 815a1c0
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 13 deletions.
35 changes: 35 additions & 0 deletions b/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions b/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
chrono = "0.4.19"
nom = "6.1.2"
serde_json = "1.0.64"
structopt = "0.3.21"
Expand Down
110 changes: 98 additions & 12 deletions b/src/list.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,104 @@
use std::path::PathBuf;
use chrono::{DateTime, Local, NaiveDate, NaiveDateTime, TimeZone, Utc};
use std::{
io,
path::{Path, PathBuf},
str::FromStr,
};

pub fn list(data_dir: PathBuf, query: String) {
let ymd = query.split('-').collect::<Vec<&str>>();
let (y, m, d) = match ymd[..] {
[y, m, d] => (y, m, d),
_ => return,
type DateRange = (DateTime<Utc>, DateTime<Utc>);

fn utc_date_range(date: &str) -> DateRange {
let date = NaiveDate::from_str(date).unwrap();
let start = date.and_hms(0, 0, 0);
let end = date.and_hms(23, 59, 59);
let start = Local.from_local_datetime(&start).unwrap();
let end = Local.from_local_datetime(&end).unwrap();
let start = DateTime::<Utc>::from(start);
let end = DateTime::<Utc>::from(end);
(start, end)
}

fn in_date_range(date_range: &DateRange, date: &str) -> bool {
let dt = NaiveDateTime::parse_from_str(&date[0..date.len() - 1], "%Y%m%dT%H%M%S").unwrap();
let dt = Utc.from_utc_datetime(&dt);
(date_range.0..=date_range.1).contains(&dt)
}

fn dirs(data_dir: &Path, date_range: &DateRange) -> Vec<PathBuf> {
let (start, end) = date_range;
let dates = if start == end {
vec![start]
} else {
vec![start, end]
};

let dir = data_dir.join("flow").join(y).join(m).join(d);
for dir_entry in dir.read_dir().unwrap() {
let dir_entry = dir_entry.unwrap();
let path = dir_entry.path();
if path.extension().unwrap().to_str().unwrap() == "md" {
println!("{}", dir.join(path).as_path().to_str().unwrap());
dates
.into_iter()
.map(|date| {
let date_string = date.naive_utc().date().to_string();
let ymd = date_string.split('-').collect::<Vec<&str>>();
let (y, m, d) = match ymd[..] {
[y, m, d] => (y, m, d),
_ => unreachable!(),
};
data_dir.join("flow").join(y).join(m).join(d)
})
.collect::<Vec<PathBuf>>()
}

fn list_files(data_dir: PathBuf, query: String) -> Vec<PathBuf> {
let mut files = vec![];
let date_range = utc_date_range(query.as_str());
let dirs = dirs(data_dir.as_path(), &date_range);
for dir in dirs {
for dir_entry in dir.read_dir().unwrap() {
let dir_entry = dir_entry.unwrap();
let path = dir_entry.path();
if path.extension().unwrap().to_str().unwrap() == "md"
&& in_date_range(&date_range, path.file_stem().unwrap().to_str().unwrap())
{
files.push(dir.join(path));
}
}
}
files.sort();
files
}

pub fn list(data_dir: PathBuf, query: String, writer: &mut impl io::Write) {
let files = list_files(data_dir, query);
for file in files {
writeln!(writer, "{}", file.as_path().to_str().unwrap()).unwrap();
}
}

#[cfg(test)]
mod tests {
use super::*;
use std::fs;
use tempfile::tempdir;

#[test]
fn test() {
let dir = tempdir().unwrap();
let dir20210202 = dir.path().join("flow").join("2021").join("02").join("02");
let dir20210203 = dir.path().join("flow").join("2021").join("02").join("03");
fs::create_dir_all(dir20210202.as_path()).unwrap();
fs::create_dir_all(dir20210203.as_path()).unwrap();
let files = vec![
dir20210202.join("20210202T145959Z.md"),
dir20210202.join("20210202T150000Z.md"),
dir20210202.join("20210202T235959Z.md"),
dir20210203.join("20210203T000000Z.md"),
dir20210203.join("20210203T145959Z.md"),
dir20210203.join("20210203T150000Z.md"),
];
for f in files.iter() {
fs::write(f.as_path(), "").unwrap();
}
assert_eq!(
list_files(dir.path().to_path_buf(), "2021-02-03".to_string()),
files[1..1 + 4]
);
}
}
2 changes: 1 addition & 1 deletion b/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ enum Subcommand {
fn main() {
let opt = Opt::from_args();
match opt.subcommand {
Subcommand::List { data_dir, query } => list(data_dir, query),
Subcommand::List { data_dir, query } => list(data_dir, query, &mut io::stdout()),
Subcommand::New {
data_file,
template,
Expand Down

0 comments on commit 815a1c0

Please sign in to comment.