diff --git a/packages/os/Cargo.toml b/packages/os/Cargo.toml index 23fa8a594b3..c719124543a 100644 --- a/packages/os/Cargo.toml +++ b/packages/os/Cargo.toml @@ -10,6 +10,7 @@ variant-sensitive = true source-groups = [ "api", "bottlerocket-release", + "parse-datetime", "growpart", "updater", "webpki-roots-shim", diff --git a/sources/Cargo.lock b/sources/Cargo.lock index 307ab364efa..5dfaa005c81 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -46,7 +46,7 @@ dependencies = [ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -270,7 +270,7 @@ dependencies = [ "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-unix-connector 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -292,7 +292,7 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -436,7 +436,7 @@ dependencies = [ name = "block-party" version = "0.1.0" dependencies = [ - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -456,7 +456,7 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -543,7 +543,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "chrono" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -726,7 +726,7 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1002,7 +1002,7 @@ dependencies = [ "cargo-readme 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "gptman 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1086,7 +1086,7 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1261,7 +1261,7 @@ version = "0.1.0" dependencies = [ "cargo-readme 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "filetime 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "sys-mount 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1362,7 +1362,7 @@ dependencies = [ "schnauzer 0.1.0", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1379,7 +1379,7 @@ dependencies = [ "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1457,7 +1457,7 @@ dependencies = [ "model-derive 0.1.0", "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1485,7 +1485,7 @@ dependencies = [ "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_plain 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1589,6 +1589,15 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parse-datetime" +version = "0.1.0" +dependencies = [ + "cargo-readme 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pem" version = "0.7.0" @@ -1683,7 +1692,7 @@ dependencies = [ "cargo-readme 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2011,7 +2020,7 @@ dependencies = [ "models 0.1.0", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2122,7 +2131,7 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2136,7 +2145,7 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2183,7 +2192,7 @@ dependencies = [ "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_plain 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2191,7 +2200,7 @@ name = "simplelog" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2223,16 +2232,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "snafu" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)", "doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu-derive 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu-derive 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "snafu-derive" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2273,7 +2283,7 @@ dependencies = [ "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2322,7 +2332,7 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2420,7 +2430,7 @@ dependencies = [ "schnauzer 0.1.0", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2515,7 +2525,7 @@ name = "tough" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "olpc-cjson 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "pem 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2524,7 +2534,7 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "serde_plain 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2634,7 +2644,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "update_metadata" version = "0.1.0" dependencies = [ - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "migrator 0.1.0", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2642,7 +2652,7 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "serde_plain 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2650,7 +2660,7 @@ name = "updog" version = "0.1.0" dependencies = [ "bottlerocket-release 0.1.0", - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lz4 1.23.1 (registry+https://github.com/rust-lang/crates.io-index)", "migrator 0.1.0", @@ -2664,7 +2674,7 @@ dependencies = [ "signal-hook 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "signpost 0.1.0", "simplelog 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "structopt 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2956,7 +2966,7 @@ dependencies = [ "checksum cargo_metadata 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e5d1b4d380e1bab994591a24c2bdd1b054f64b60bef483a8c598c7c345bc3bbe" "checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" +"checksum chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" @@ -3124,8 +3134,8 @@ dependencies = [ "checksum skeptic 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6fb8ed853fdc19ce09752d63f3a2e5b5158aeb261520cd75eb618bd60305165" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" -"checksum snafu 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "546db9181bce2aa22ed883c33d65603b76335b4c2533a98289f54265043de7a1" -"checksum snafu-derive 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bdc75da2e0323f297402fd9c8fdba709bb04e4c627cbe31d19a2c91fc8d9f0e2" +"checksum snafu 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "48492e4f51c6e679217e80c11290edfdedf3133e358f4f432a6296f4c820f95b" +"checksum snafu-derive 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b5d1c41856cbfa99befda5034c72539dd9d7dd6f3e61058bdb804ac40715bc2a" "checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" diff --git a/sources/Cargo.toml b/sources/Cargo.toml index 23f7a7221e6..f7e5d74c579 100644 --- a/sources/Cargo.toml +++ b/sources/Cargo.toml @@ -24,6 +24,8 @@ members = [ "models", + "parse-datetime", + "preinit/laika", "updater/block-party", diff --git a/sources/parse-datetime/Cargo.toml b/sources/parse-datetime/Cargo.toml new file mode 100644 index 00000000000..f67620a8f8f --- /dev/null +++ b/sources/parse-datetime/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "parse-datetime" +version = "0.1.0" +authors = ["Zac Mrowicki "] +license = "Apache-2.0 OR MIT" +edition = "2018" +publish = false + +[dependencies] +chrono = "0.4.11" +snafu = { version = "0.6.3", features = ["backtraces-impl-backtrace-crate"] } + +[build-dependencies] +cargo-readme = "3.1" diff --git a/sources/parse-datetime/README.md b/sources/parse-datetime/README.md new file mode 100644 index 00000000000..33258616879 --- /dev/null +++ b/sources/parse-datetime/README.md @@ -0,0 +1,25 @@ +# parse-datetime + +Current version: 0.1.0 + +## Background + +This library parses a `DateTime` from a string. + +The string can be: + +* an `RFC3339` formatted date / time +* a string with the form `"in "` where + * `` may be any unsigned integer and + * `` may be either the singular or plural form of the following: `hour | hours`, `day | days`, `week | weeks` + +Examples: + +* `"in 1 hour"` +* `"in 2 hours"` +* `"in 6 days"` +* `"in 2 weeks"` + +## Colophon + +This text was generated from `README.tpl` using [cargo-readme](https://crates.io/crates/cargo-readme), and includes the rustdoc from `src/lib.rs`. \ No newline at end of file diff --git a/sources/parse-datetime/README.tpl b/sources/parse-datetime/README.tpl new file mode 100644 index 00000000000..91fb62910c8 --- /dev/null +++ b/sources/parse-datetime/README.tpl @@ -0,0 +1,9 @@ +# {{crate}} + +Current version: {{version}} + +{{readme}} + +## Colophon + +This text was generated from `README.tpl` using [cargo-readme](https://crates.io/crates/cargo-readme), and includes the rustdoc from `src/lib.rs`. diff --git a/sources/parse-datetime/build.rs b/sources/parse-datetime/build.rs new file mode 100644 index 00000000000..4eec4b80b5e --- /dev/null +++ b/sources/parse-datetime/build.rs @@ -0,0 +1,45 @@ +// Automatically generate README.md from rustdoc. + +use std::env; +use std::fs::{self, File}; +use std::io::Write; +use std::path::{Path, PathBuf}; + +fn generate_readme() { + // Check for environment variable "SKIP_README". If it is set, + // skip README generation + if env::var_os("SKIP_README").is_some() { + return; + } + + let mut source = File::open("src/lib.rs").unwrap(); + let mut template = File::open("README.tpl").unwrap(); + + let content = cargo_readme::generate_readme( + &PathBuf::from("."), // root + &mut source, // source + Some(&mut template), // template + // The "add x" arguments don't apply when using a template. + true, // add title + false, // add badges + false, // add license + true, // indent headings + ) + .unwrap(); + + let mut readme = File::create("README.md").unwrap(); + readme.write_all(content.as_bytes()).unwrap(); +} + +fn generate_constants() { + let out_dir = env::var("OUT_DIR").unwrap(); + let arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); + let contents = format!("const ARCH: &str = \"{}\";", arch); + let path = Path::new(&out_dir).join("constants.rs"); + fs::write(path, contents).unwrap(); +} + +fn main() { + generate_readme(); + generate_constants(); +} diff --git a/sources/parse-datetime/src/lib.rs b/sources/parse-datetime/src/lib.rs new file mode 100644 index 00000000000..38f79798632 --- /dev/null +++ b/sources/parse-datetime/src/lib.rs @@ -0,0 +1,130 @@ +/*! +# Background + +This library parses a `DateTime` from a string. + +The string can be: + +* an `RFC3339` formatted date / time +* a string with the form `"in "` where + * `` may be any unsigned integer and + * `` may be either the singular or plural form of the following: `hour | hours`, `day | days`, `week | weeks` + +Examples: + +* `"in 1 hour"` +* `"in 2 hours"` +* `"in 6 days"` +* `"in 2 weeks"` +*/ + +use chrono::{DateTime, Duration, FixedOffset, Utc}; +use snafu::{ensure, ResultExt}; + +mod error { + use snafu::Snafu; + + #[derive(Debug, Snafu)] + #[snafu(visibility = "pub(super)")] + pub enum Error { + #[snafu(display("Date argument '{}' is invalid: {}", input, msg))] + DateArgInvalid { input: String, msg: &'static str }, + + #[snafu(display( + "Date argument had count '{}' that failed to parse as integer: {}", + input, + source + ))] + DateArgCount { + input: String, + source: std::num::ParseIntError, + }, + } +} +pub use error::Error; +type Result = std::result::Result; + +/// Parses a user-specified datetime, either in full RFC 3339 format, or a shorthand like "in 7 +/// days" +pub fn parse_datetime(input: &str) -> Result> { + // If the user gave an absolute date in a standard format, accept it. + let try_dt: std::result::Result, chrono::format::ParseError> = + DateTime::parse_from_rfc3339(input); + if let Ok(dt) = try_dt { + let utc = dt.into(); + return Ok(utc); + } + + // Otherwise, pull apart a request like "in 5 days" to get an exact datetime. + let mut parts: Vec<&str> = input.split_whitespace().collect(); + ensure!( + parts.len() == 3, + error::DateArgInvalid { + input, + msg: "expected RFC 3339, or something like 'in 7 days'" + } + ); + let unit_str = parts.pop().unwrap(); + let count_str = parts.pop().unwrap(); + let prefix_str = parts.pop().unwrap(); + + ensure!( + prefix_str == "in", + error::DateArgInvalid { + input, + msg: "expected RFC 3339, or prefix 'in', something like 'in 7 days'", + } + ); + + let count: u32 = count_str.parse().context(error::DateArgCount { input })?; + + let duration = match unit_str { + "hour" | "hours" => Duration::hours(i64::from(count)), + "day" | "days" => Duration::days(i64::from(count)), + "week" | "weeks" => Duration::weeks(i64::from(count)), + _ => { + return error::DateArgInvalid { + input, + msg: "date argument's unit must be hours/days/weeks", + } + .fail(); + } + }; + + let now = Utc::now(); + let then = now + duration; + Ok(then) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_acceptable_strings() { + let inputs = vec![ + "in 0 hours", + "in 1 hour", + "in 5000000 hours", + "in 0 days", + "in 1 day", + "in 5000000 days", + "in 0 weeks", + "in 1 week", + "in 5000000 weeks", + ]; + + for input in inputs { + assert!(parse_datetime(input).is_ok()) + } + } + + #[test] + fn test_unacceptable_strings() { + let inputs = vec!["in", "0 hours", "hours", "in 1 month"]; + + for input in inputs { + assert!(parse_datetime(input).is_err()) + } + } +}