close tho
parent
66f533a210
commit
00813e39a9
|
|
@ -70,6 +70,15 @@ version = "0.8.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
|
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "croner"
|
||||||
|
version = "2.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "516aad5374ea0ea75a0f0f4512fb4e7ad46c5eeff9971cb8ebc8fd74f1cd16c1"
|
||||||
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "equivalent"
|
name = "equivalent"
|
||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
|
|
@ -177,6 +186,7 @@ name = "pttodoer"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
|
"croner",
|
||||||
"regex",
|
"regex",
|
||||||
"serde_yaml",
|
"serde_yaml",
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -7,5 +7,6 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
chrono = "0.4.38"
|
chrono = "0.4.38"
|
||||||
|
croner = "2.0.4"
|
||||||
regex = "1.10.4"
|
regex = "1.10.4"
|
||||||
serde_yaml = "0.9.34"
|
serde_yaml = "0.9.34"
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ use serde_yaml;
|
||||||
use chrono::DateTime;
|
use chrono::DateTime;
|
||||||
use chrono::naive::NaiveDateTime;
|
use chrono::naive::NaiveDateTime;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
use croner;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("{:?}", Task::new())
|
println!("{:?}", Task::new())
|
||||||
|
|
@ -65,6 +66,29 @@ impl When {
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn next(&self, now: TS) -> TS {
|
||||||
|
match Duration::new(self.0.clone()) {
|
||||||
|
Ok(duration) => {
|
||||||
|
return TS::from_unix(
|
||||||
|
now.unix() + duration.0
|
||||||
|
);
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
|
};
|
||||||
|
match TS::new(self.0.clone()) {
|
||||||
|
Ok(ts) => { return ts; },
|
||||||
|
_ => {},
|
||||||
|
};
|
||||||
|
match Cron::new(self.0.clone()) {
|
||||||
|
Ok(x) => {
|
||||||
|
return x.next(now);
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
|
};
|
||||||
|
assert!(false, "invalid when cooked");
|
||||||
|
now
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
@ -75,7 +99,34 @@ mod test_when {
|
||||||
fn parse() {
|
fn parse() {
|
||||||
match When::new("1d2h3m".to_string()) {
|
match When::new("1d2h3m".to_string()) {
|
||||||
Ok(when) => {
|
Ok(when) => {
|
||||||
assert_eq!(1714521600 + 60*3 + 60*60*2 + 60*60*24*1, when.next(TS::new("2024-05-01T00").unwrap()));
|
assert_eq!(
|
||||||
|
1714521600 + 60*3 + 60*60*2 + 60*60*24*1,
|
||||||
|
when.next(
|
||||||
|
TS::new("2024-05-01T00".to_string())
|
||||||
|
.unwrap()
|
||||||
|
).unix()
|
||||||
|
);
|
||||||
|
},
|
||||||
|
Err(err) => assert!(false, "failed to parse when: {}", err),
|
||||||
|
};
|
||||||
|
match When::new("2024-05-01T00:00Z".to_string()) {
|
||||||
|
Ok(when) => {
|
||||||
|
assert_eq!(
|
||||||
|
1714521600 ,
|
||||||
|
when.next(
|
||||||
|
TS::new("2024-05-01T00".to_string())
|
||||||
|
.unwrap()
|
||||||
|
).unix()
|
||||||
|
);
|
||||||
|
},
|
||||||
|
Err(err) => assert!(false, "failed to parse when: {}", err),
|
||||||
|
};
|
||||||
|
match When::new("0 1 * * *".to_string()) {
|
||||||
|
Ok(when) => {
|
||||||
|
assert_eq!(
|
||||||
|
1714521600 + 60*60,
|
||||||
|
when.next(TS::from_unix(1714521600)).unix()
|
||||||
|
);
|
||||||
},
|
},
|
||||||
Err(err) => assert!(false, "failed to parse when: {}", err),
|
Err(err) => assert!(false, "failed to parse when: {}", err),
|
||||||
};
|
};
|
||||||
|
|
@ -87,10 +138,42 @@ struct Cron(String);
|
||||||
|
|
||||||
impl Cron {
|
impl Cron {
|
||||||
fn new(src: String) -> Result<Cron, String> {
|
fn new(src: String) -> Result<Cron, String> {
|
||||||
Err("not impl".to_string())
|
match croner::Cron::new(src.as_str()).parse() {
|
||||||
|
Ok(_) => Ok(Cron{0: src}),
|
||||||
|
Err(msg) => Err(format!("bad cron: {}", msg)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn next(&self, now: TS) -> TS {
|
||||||
|
match croner::Cron::new(self.0.as_str()).parse() {
|
||||||
|
Ok(c) => match c.find_next_occurrence(
|
||||||
|
&DateTime::from_timestamp(now.unix() as i64, 0).unwrap(),
|
||||||
|
true,
|
||||||
|
) {
|
||||||
|
Ok(dt) => {
|
||||||
|
return TS::from_unix(dt.timestamp() as u64);
|
||||||
|
},
|
||||||
|
Err(_) => TS::from_unix(0),
|
||||||
|
},
|
||||||
|
_ => TS::from_unix(0),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test_cron {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse() {
|
||||||
|
match Cron::new("1 * * * *".to_string()) {
|
||||||
|
Ok(c) => assert_eq!(1714525200+60, c.next(TS::from_unix(1714525200)).unix()),
|
||||||
|
Err(err) => assert!(false, "failed to parse cron: {}", err),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Duration(u64);
|
struct Duration(u64);
|
||||||
|
|
||||||
|
|
@ -157,6 +240,10 @@ mod test_duration {
|
||||||
struct TS(u64);
|
struct TS(u64);
|
||||||
|
|
||||||
impl TS {
|
impl TS {
|
||||||
|
fn from_unix(src: u64) -> TS {
|
||||||
|
TS{0: src}
|
||||||
|
}
|
||||||
|
|
||||||
fn new(src: String) -> Result<TS, String> {
|
fn new(src: String) -> Result<TS, String> {
|
||||||
match DateTime::parse_from_str(
|
match DateTime::parse_from_str(
|
||||||
&format!("{} +0000", src),
|
&format!("{} +0000", src),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue