From 6a66b7a84ba69931f1033e960e4cf7d4dab2c819 Mon Sep 17 00:00:00 2001 From: "Dustin J. Mitchell" Date: Sat, 10 Nov 2018 19:34:23 -0500 Subject: [PATCH] parse all defined fields in tasks --- Cargo.lock | 426 +++------------------------------------- Cargo.toml | 8 +- src/main.rs | 3 + src/task.rs | 17 -- src/task/mod.rs | 7 + src/task/task.rs | 55 ++++++ src/task/taskbuilder.rs | 194 ++++++++++++++++++ src/tdb2/ff4.rs | 19 +- 8 files changed, 298 insertions(+), 431 deletions(-) delete mode 100644 src/task.rs create mode 100644 src/task/mod.rs create mode 100644 src/task/task.rs create mode 100644 src/task/taskbuilder.rs diff --git a/Cargo.lock b/Cargo.lock index 81866a154..664e462ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,217 +1,37 @@ [[package]] -name = "aho-corasick" -version = "0.6.9" +name = "chrono" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "atty" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bitflags" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cfg-if" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "clap" -version = "2.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "clicolors-control" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "console" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "clicolors-control 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "indicatif" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "console 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lazy_static" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "lazy_static" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" version = "0.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "lock_api" -version = "0.1.4" +name = "num-integer" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "memchr" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "owning_ref" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.3.0" +name = "num-traits" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rask" version = "0.1.0" dependencies = [ - "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "console 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "indicatif 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -220,172 +40,18 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ucd-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ucd-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "scopeguard" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "smallvec" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stable_deref_trait" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "strsim" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "termion" -version = "1.5.1" +name = "time" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "termios" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "textwrap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ucd-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicode-width" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "utf8-ranges" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "vec_map" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.2.8" +name = "uuid" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -397,11 +63,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -413,56 +74,13 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" -"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" -"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" -"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" -"checksum clicolors-control 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f84dec9bc083ce2503908cd305af98bd363da6f54bf8d4bf0ac14ee749ad5d1" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum console 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd48adf136733979b49e15bc3b4c43cc0d3c85ece7bd08e6daa414c6fcb13e6" -"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum indicatif 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a29b2fa6f00010c268bface64c18bb0310aaa70d46a195d5382d288c477fb016" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" +"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" -"checksum lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775751a3e69bde4df9b38dd00a1b5d6ac13791e4223d4a0506577f0dd27cfb7a" -"checksum memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0a3eb002f0535929f1199681417029ebea04aadc0c7a4224b46be99c7f5d6a16" -"checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" -"checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" -"checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" -"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" -"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372" -"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db" +"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" +"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384" -"checksum regex 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ee84f70c8c08744ea9641a731c7fadb475bf2ecc52d7f627feb833e0b3990467" -"checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" -"checksum regex-syntax 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fbc557aac2b708fe84121caf261346cc2eed71978024337e42eb46b8a252ac6e" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "153ffa32fd170e9944f7e0838edf824a754ec4c1fc64746fcc9fe1f8fa602e5d" -"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" -"checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" -"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" -"checksum termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72b620c5ea021d75a735c943269bb07d30c9b77d6ac6b236bc8b5c496ef05625" -"checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" -"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum ucd-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d0f8bfa9ff0cadcd210129ad9d2c5f145c13e9ced3d3e5d948a6213487d52444" -"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" -"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" -"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" -"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" +"checksum uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dab5c5526c5caa3d106653401a267fed923e7046f35895ffcb5ca42db64942e6" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml index 39089eff2..8f9fe62a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,8 @@ version = "0.1.0" authors = ["Dustin J. Mitchell "] [dependencies] -clap = "2.32" -console = "0.6.2" -indicatif = "0.9.0" +#clap = "2.32" +#console = "0.6.2" +#indicatif = "0.9.0" +uuid = "0.7" +chrono = "0.4" diff --git a/src/main.rs b/src/main.rs index af111278e..161b8513f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,6 @@ +extern crate chrono; +extern crate uuid; + mod tdb2; mod task; diff --git a/src/task.rs b/src/task.rs deleted file mode 100644 index 4e1085588..000000000 --- a/src/task.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::collections::HashMap; - -#[derive(Debug)] -pub struct Task { - data: HashMap, -} - -impl Task { - /// Construct a Task from a hashmap containing named properties - pub fn from_data(data: HashMap) -> Self { - Self { data } - } - - pub fn description(&self) -> &str { - self.data.get("description").unwrap() - } -} diff --git a/src/task/mod.rs b/src/task/mod.rs new file mode 100644 index 000000000..6587458ba --- /dev/null +++ b/src/task/mod.rs @@ -0,0 +1,7 @@ +mod task; +mod taskbuilder; + +pub use self::taskbuilder::TaskBuilder; +pub use self::task::{Task, Priority, Status, Timestamp, Annotation}; +pub use self::task::Priority::*; +pub use self::task::Status::*; diff --git a/src/task/task.rs b/src/task/task.rs new file mode 100644 index 000000000..29e8f4925 --- /dev/null +++ b/src/task/task.rs @@ -0,0 +1,55 @@ +use std::collections::HashMap; +use uuid::Uuid; +use chrono::prelude::*; + +pub type Timestamp = DateTime; + +#[derive(Debug, PartialEq)] +pub enum Priority { + L, + M, + H, +} + +#[derive(Debug, PartialEq)] +pub enum Status { + Pending, + Completed, + Deleted, + Recurring, + Waiting, +} + +#[derive(Debug, PartialEq)] +pub struct Annotation { + pub entry: Timestamp, + pub description: String, +} + +/// A task, the fundamental business object of this tool. +/// +/// This structure is based on https://taskwarrior.org/docs/design/task.html +#[derive(Debug)] +pub struct Task { + pub status: Status, + pub uuid: Uuid, + pub entry: Timestamp, + pub description: String, + pub start: Option, + pub end: Option, + pub due: Option, + pub until: Option, + pub wait: Option, + pub modified: Timestamp, + pub scheduled: Option, + pub recur: Option, + pub mask: Option, + pub imask: Option, + pub parent: Option, + pub project: Option, + pub priority: Option, + pub depends: Vec, + pub tags: Vec, + pub annotations: Vec, + pub udas: HashMap, +} diff --git a/src/task/taskbuilder.rs b/src/task/taskbuilder.rs new file mode 100644 index 000000000..c2a8d84ca --- /dev/null +++ b/src/task/taskbuilder.rs @@ -0,0 +1,194 @@ +use std::collections::HashMap; +use chrono::prelude::*; +use std::str; +use uuid::Uuid; +use task::{Task, Priority, Status, Timestamp, Annotation}; + +#[derive(Default)] +pub struct TaskBuilder { + status: Option, + uuid: Option, + entry: Option, + description: Option, + start: Option, + end: Option, + due: Option, + until: Option, + wait: Option, + modified: Option, + scheduled: Option, + recur: Option, + mask: Option, + imask: Option, + parent: Option, + project: Option, + priority: Option, + depends: Vec, + tags: Vec, + annotations: Vec, + udas: HashMap, +} + +/// Parse an "integer", allowing for occasional integers with trailing decimal zeroes +fn parse_int(value: &str) -> Result::Err> +where + T: str::FromStr, +{ + // some integers are rendered with following decimal zeroes + if let Some(i) = value.find('.') { + let mut nonzero = false; + for c in value[i + 1..].chars() { + if c != '0' { + nonzero = true; + break; + } + } + if !nonzero { + return value[..i].parse(); + } + } + value.parse() +} + +/// Parse a status into a Status enum value +fn parse_status(value: &str) -> Result { + match value { + "pending" => Ok(Status::Pending), + "completed" => Ok(Status::Completed), + "deleted" => Ok(Status::Deleted), + "recurring" => Ok(Status::Recurring), + "waiting" => Ok(Status::Waiting), + _ => Err(format!("invalid status {}", value)), + } +} + +/// Parse "L", "M", "H" into the Priority enum + +fn parse_priority(value: &str) -> Result { + match value { + "L" => Ok(Priority::L), + "M" => Ok(Priority::M), + "H" => Ok(Priority::H), + _ => Err(format!("invalid priority {}", value)), + } +} + +/// Parse a UNIX timestamp into a UTC DateTime +fn parse_timestamp(value: &str) -> Result::Err> { + Ok(Utc.timestamp(parse_int::(value)?, 0)) +} + +/// Parse depends, as a list of ,-separated UUIDs +fn parse_depends(value: &str) -> Result, uuid::parser::ParseError> { + value.split(',').map(|s| Uuid::parse_str(s)).collect() +} + +/// Parse tags, as a list of ,-separated strings +fn parse_tags(value: &str) -> Vec { + value.split(',').map(|s| s.to_string()).collect() +} + +impl TaskBuilder { + pub fn new() -> Self { + Default::default() + } + + pub fn set(mut self, name: &str, value: String) -> Self { + const ANNOTATION_PREFIX: &str = "annotation_"; + if name.starts_with(ANNOTATION_PREFIX) { + let entry = parse_timestamp(&name[ANNOTATION_PREFIX.len()..]).unwrap(); + self.annotations.push(Annotation { + entry, + description: value.to_string(), + }); + return self; + } + match name { + "status" => self.status = Some(parse_status(&value).unwrap()), + "uuid" => self.uuid = Some(Uuid::parse_str(&value).unwrap()), + "entry" => self.entry = Some(parse_timestamp(&value).unwrap()), + "description" => self.description = Some(value), + "start" => self.start = Some(parse_timestamp(&value).unwrap()), + "end" => self.end = Some(parse_timestamp(&value).unwrap()), + "due" => self.due = Some(parse_timestamp(&value).unwrap()), + "until" => self.until = Some(parse_timestamp(&value).unwrap()), + "wait" => self.wait = Some(parse_timestamp(&value).unwrap()), + "modified" => self.modified = Some(parse_timestamp(&value).unwrap()), + "scheduled" => self.scheduled = Some(parse_timestamp(&value).unwrap()), + "recur" => self.recur = Some(value), + "mask" => self.mask = Some(value), + "imask" => self.imask = Some(parse_int::(&value).unwrap()), + "parent" => self.uuid = Some(Uuid::parse_str(&value).unwrap()), + "project" => self.project = Some(value), + "priority" => self.priority = Some(parse_priority(&value).unwrap()), + "depends" => self.depends = parse_depends(&value).unwrap(), + "tags" => self.tags = parse_tags(&value), + _ => { + self.udas.insert(name.to_string(), value); + } + } + self + } + + pub fn finish(self) -> Task { + Task { + status: self.status.unwrap(), + uuid: self.uuid.unwrap(), + description: self.description.unwrap(), + entry: self.entry.unwrap(), + start: self.start, + end: self.end, + due: self.due, + until: self.until, + wait: self.wait, + modified: self.modified.unwrap(), + scheduled: self.scheduled, + recur: self.recur, + mask: self.mask, + imask: self.imask, + parent: self.parent, + project: self.project, + priority: self.priority, + depends: self.depends, + tags: self.tags, + annotations: self.annotations, + udas: self.udas, + } + + // TODO: check validity per https://taskwarrior.org/docs/design/task.html + } +} + +#[cfg(test)] +mod test { + use super::{parse_int, parse_depends}; + use uuid::Uuid; + + #[test] + fn test_parse_int() { + assert_eq!(parse_int::("123").unwrap(), 123u8); + assert_eq!(parse_int::("123000000").unwrap(), 123000000u32); + assert_eq!(parse_int::("-123000000").unwrap(), -123000000i32); + } + + #[test] + fn test_parse_int_decimals() { + assert_eq!(parse_int::("123.00").unwrap(), 123u8); + assert_eq!(parse_int::("123.0000").unwrap(), 123u32); + assert_eq!(parse_int::("-123.").unwrap(), -123i32); + } + + #[test] + fn test_parse_depends() { + let u1 = "123e4567-e89b-12d3-a456-426655440000"; + let u2 = "123e4567-e89b-12d3-a456-999999990000"; + assert_eq!( + parse_depends(u1).unwrap(), + vec![Uuid::parse_str(u1).unwrap()] + ); + assert_eq!( + parse_depends(&format!("{},{}", u1, u2)).unwrap(), + vec![Uuid::parse_str(u1).unwrap(), Uuid::parse_str(u2).unwrap()] + ); + } +} diff --git a/src/tdb2/ff4.rs b/src/tdb2/ff4.rs index 69c9a81cd..a30078a67 100644 --- a/src/tdb2/ff4.rs +++ b/src/tdb2/ff4.rs @@ -1,9 +1,8 @@ use std::str; use std::io::{Result, Error, ErrorKind}; -use std::collections::HashMap; use super::nibbler::Nibbler; -use super::super::task::Task; +use task::{TaskBuilder, Task}; /// Rust implementation of part of utf8_codepoint from Taskwarrior's src/utf8.cpp /// @@ -88,7 +87,7 @@ fn decode(value: String) -> String { /// While Taskwarrior supports additional formats, this is the only format supported by rask. pub(super) fn parse_ff4(line: &str) -> Result { let mut nib = Nibbler::new(line.as_bytes()); - let mut data = HashMap::new(); + let mut builder = TaskBuilder::new(); if !nib.skip(b'[') { return Err(Error::new(ErrorKind::Other, "bad line")); @@ -97,13 +96,14 @@ pub(super) fn parse_ff4(line: &str) -> Result { let mut nib = Nibbler::new(line); while !nib.depleted() { if let Some(name) = nib.get_until(b':') { + let name = str::from_utf8(name).unwrap(); if !nib.skip(b':') { return Err(Error::new(ErrorKind::Other, "bad line")); } if let Some(value) = nib.get_quoted(b'"') { let value = json_decode(value); let value = decode(value); - data.insert(String::from_utf8(name.to_vec()).unwrap(), value); + builder = builder.set(name, value); } else { return Err(Error::new(ErrorKind::Other, "bad line")); } @@ -121,12 +121,13 @@ pub(super) fn parse_ff4(line: &str) -> Result { if !nib.depleted() { return Err(Error::new(ErrorKind::Other, "bad line")); } - Ok(Task::from_data(data)) + Ok(builder.finish()) } #[cfg(test)] mod test { use super::{decode, json_decode, hex_to_unicode, parse_ff4}; + use task::Pending; #[test] fn test_hex_to_unicode_digits() { @@ -217,7 +218,11 @@ mod test { #[test] fn test_parse_ff4() { - let task = parse_ff4("[description:\"desc\"]").unwrap(); - assert_eq!(task.description(), "desc"); + let s = "[description:\"desc\" entry:\"1437855511\" modified:\"1479480556\" \ + priority:\"L\" project:\"lists\" status:\"pending\" tags:\"watch\" \ + uuid:\"83ce989e-8634-4d62-841c-eb309383ff1f\"]"; + let task = parse_ff4(s).unwrap(); + assert_eq!(task.status, Pending); + assert_eq!(task.description, "desc"); } }