diff options
Diffstat (limited to '')
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | .sqlx/query-35377e909733a108deaf8839b6f2603ec8c4a54ec750154fa10005e801b7d26c.json | 12 | ||||
| -rw-r--r-- | Cargo.lock | 1307 | ||||
| -rw-r--r-- | Cargo.toml | 4 | ||||
| -rw-r--r-- | fj.db | bin | 36864 -> 0 bytes | |||
| -rw-r--r-- | migrations/1.sql | 36 | ||||
| -rw-r--r-- | migrations/20240726140649_fj.sql | 35 | ||||
| -rw-r--r-- | src/db.rs | 347 | ||||
| -rw-r--r-- | src/error.rs | 18 | ||||
| -rw-r--r-- | src/lib.rs | 4 | ||||
| -rw-r--r-- | src/task.rs | 110 | ||||
| -rw-r--r-- | src/timestamp.rs | 1 | ||||
| -rw-r--r-- | tasks.rs | 4 | 
13 files changed, 522 insertions, 1357 deletions
| @@ -1 +1,2 @@  /target +fj.db diff --git a/.sqlx/query-35377e909733a108deaf8839b6f2603ec8c4a54ec750154fa10005e801b7d26c.json b/.sqlx/query-35377e909733a108deaf8839b6f2603ec8c4a54ec750154fa10005e801b7d26c.json deleted file mode 100644 index 3152ae2..0000000 --- a/.sqlx/query-35377e909733a108deaf8839b6f2603ec8c4a54ec750154fa10005e801b7d26c.json +++ /dev/null @@ -1,12 +0,0 @@ -{ -  "db_name": "SQLite", -  "query": "insert into tasks ( name, cron, archived, description ) values ( ?1, ?2, ?3, ?4 )", -  "describe": { -    "columns": [], -    "parameters": { -      "Right": 4 -    }, -    "nullable": [] -  }, -  "hash": "35377e909733a108deaf8839b6f2603ec8c4a54ec750154fa10005e801b7d26c" -} @@ -1,24 +1,6 @@  # This file is automatically @generated by Cargo.  # It is not intended for manual editing. -version = 3 - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +version = 4  [[package]]  name = "android-tzdata" @@ -71,7 +53,7 @@ version = "1.1.0"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391"  dependencies = [ - "windows-sys 0.52.0", + "windows-sys",  ]  [[package]] @@ -81,16 +63,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"  dependencies = [   "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", + "windows-sys",  ]  [[package]] @@ -100,40 +73,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"  [[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]]  name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" -dependencies = [ - "serde", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" +version = "2.9.1"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"  [[package]]  name = "bumpalo" @@ -142,18 +85,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"  [[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" - -[[package]]  name = "cc"  version = "1.1.6"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -176,7 +107,7 @@ dependencies = [   "js-sys",   "num-traits",   "wasm-bindgen", - "windows-targets 0.52.6", + "windows-targets",  ]  [[package]] @@ -213,51 +144,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"  [[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]]  name = "core-foundation-sys"  version = "0.8.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"  [[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]]  name = "cron"  version = "0.12.1"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -269,111 +161,16 @@ dependencies = [  ]  [[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "der" -version = "0.7.9" +name = "fallible-iterator" +version = "0.3.0"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"  [[package]] -name = "dotenvy" -version = "0.15.7" +name = "fallible-streaming-iterator" +version = "0.1.9"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" -dependencies = [ - "serde", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "etcetera" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "event-listener" -version = "5.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"  [[package]]  name = "fj" @@ -382,181 +179,48 @@ dependencies = [   "chrono",   "clap",   "cron", - "sqlx", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "spin", -] - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", + "rusqlite", + "thiserror", + "uuid",  ]  [[package]] -name = "generic-array" -version = "0.14.7" +name = "foldhash" +version = "0.1.5"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"  [[package]]  name = "getrandom" -version = "0.2.15" +version = "0.3.3"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"  dependencies = [   "cfg-if",   "libc", + "r-efi",   "wasi",  ]  [[package]]  name = "hashbrown" -version = "0.14.5" +version = "0.15.3"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"  dependencies = [ - "ahash", - "allocator-api2", + "foldhash",  ]  [[package]]  name = "hashlink" -version = "0.9.1" +version = "0.10.0"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1"  dependencies = [   "hashbrown",  ]  [[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]]  name = "iana-time-zone"  version = "0.1.60"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -580,111 +244,44 @@ dependencies = [  ]  [[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]]  name = "is_terminal_polyfill"  version = "1.70.0"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"  [[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]]  name = "js-sys" -version = "0.3.69" +version = "0.3.77"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"  dependencies = [ + "once_cell",   "wasm-bindgen",  ]  [[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]]  name = "libc"  version = "0.2.155"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"  [[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]]  name = "libsqlite3-sys" -version = "0.28.0" +version = "0.34.0"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" +checksum = "91632f3b4fb6bd1d72aa3d78f41ffecfcf2b1a6648d8c241dbe7dbfaf4875e15"  dependencies = [ - "cc",   "pkg-config",   "vcpkg",  ]  [[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]]  name = "log"  version = "0.4.22"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"  [[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]]  name = "memchr"  version = "2.7.4"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -707,50 +304,12 @@ dependencies = [  ]  [[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]]  name = "num-traits"  version = "0.2.19"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"  dependencies = [   "autocfg", - "libm",  ]  [[package]] @@ -760,105 +319,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"  [[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.3", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]]  name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" +version = "0.3.32"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"  [[package]]  name = "proc-macro2" -version = "1.0.86" +version = "1.0.95"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"  dependencies = [   "unicode-ident",  ] @@ -873,421 +343,38 @@ dependencies = [  ]  [[package]] -name = "rand" -version = "0.8.5" +name = "r-efi" +version = "5.2.0"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"  [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "rusqlite" +version = "0.36.0"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "3de23c3319433716cf134eed225fe9986bc24f63bed9be9f20c329029e672dc7"  dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "rsa" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "serde" -version = "1.0.204" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.204" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.120" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -dependencies = [ - "serde", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "sqlformat" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" -dependencies = [ - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27144619c6e5802f1380337a209d2ac1c431002dd74c6e60aebff3c506dc4f0c" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a999083c1af5b5d6c071d34a708a19ba3e02106ad82ef7bbd69f5e48266b613b" -dependencies = [ - "atoi", - "byteorder", - "bytes", - "crc", - "crossbeam-queue", - "either", - "event-listener", - "futures-channel", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashbrown", + "bitflags", + "chrono", + "fallible-iterator", + "fallible-streaming-iterator",   "hashlink", - "hex", - "indexmap", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlformat", - "thiserror", - "tracing", - "url", -] - -[[package]] -name = "sqlx-macros" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23217eb7d86c584b8cbe0337b9eacf12ab76fe7673c513141ec42565698bb88" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a099220ae541c5db479c6424bdf1b200987934033c2584f79a0e1693601e776" -dependencies = [ - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn", - "tempfile", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5afe4c38a9b417b6a9a5eeffe7235d0a106716495536e7727d1c7f4b1ff3eba6" -dependencies = [ - "atoi", - "base64", - "bitflags 2.6.0", - "byteorder", - "bytes", - "crc", - "digest", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1dbb157e65f10dbe01f729339c06d239120221c9ad9fa0ba8408c4cc18ecf21" -dependencies = [ - "atoi", - "base64", - "bitflags 2.6.0", - "byteorder", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", + "libsqlite3-sys",   "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "whoami", + "uuid",  ]  [[package]] -name = "sqlx-sqlite" -version = "0.8.0" +name = "rustversion" +version = "1.0.21"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2cdd83c008a622d94499c0006d8ee5f821f36c89b7d625c900e5dc30b5c5ee" -dependencies = [ - "atoi", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "serde_urlencoded", - "sqlx-core", - "tracing", - "url", -] +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"  [[package]] -name = "stringprep" -version = "0.1.5" +name = "smallvec" +version = "1.15.0"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" -dependencies = [ - "unicode-bidi", - "unicode-normalization", - "unicode-properties", -] +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"  [[package]]  name = "strsim" @@ -1296,16 +383,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"  [[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]]  name = "syn" -version = "2.0.72" +version = "2.0.101"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"  dependencies = [   "proc-macro2",   "quote", @@ -1313,69 +394,19 @@ dependencies = [  ]  [[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]]  name = "thiserror" -version = "1.0.63" +version = "2.0.12"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"  dependencies = [   "thiserror-impl",  ]  [[package]]  name = "thiserror-impl" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" +version = "2.0.12"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"  dependencies = [   "proc-macro2",   "quote", @@ -1383,113 +414,63 @@ dependencies = [  ]  [[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]]  name = "unicode-ident"  version = "1.0.12"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"  [[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-properties" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" - -[[package]] -name = "unicode_categories" -version = "0.1.1" +name = "utf8parse" +version = "0.2.2"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"  [[package]] -name = "url" -version = "2.5.2" +name = "uuid" +version = "1.17.0"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"  dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", + "getrandom", + "js-sys", + "wasm-bindgen",  ]  [[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]]  name = "vcpkg"  version = "0.2.15"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"  [[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]]  name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.14.2+wasi-0.2.4"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +]  [[package]]  name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.100"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"  dependencies = [   "cfg-if", + "once_cell", + "rustversion",   "wasm-bindgen-macro",  ]  [[package]]  name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.100"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"  dependencies = [   "bumpalo",   "log", - "once_cell",   "proc-macro2",   "quote",   "syn", @@ -1498,9 +479,9 @@ dependencies = [  [[package]]  name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.100"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"  dependencies = [   "quote",   "wasm-bindgen-macro-support", @@ -1508,9 +489,9 @@ dependencies = [  [[package]]  name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.100"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"  dependencies = [   "proc-macro2",   "quote", @@ -1521,18 +502,11 @@ dependencies = [  [[package]]  name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.100"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "whoami" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"  dependencies = [ - "redox_syscall 0.4.1", - "wasite", + "unicode-ident",  ]  [[package]] @@ -1541,16 +515,7 @@ version = "0.52.0"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"  dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-targets",  ]  [[package]] @@ -1559,22 +524,7 @@ version = "0.52.0"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"  dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets",  ]  [[package]] @@ -1583,48 +533,30 @@ version = "0.52.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"  dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu",   "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc",  ]  [[package]]  name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm"  version = "0.52.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"  [[package]]  name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc"  version = "0.52.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"  [[package]]  name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu"  version = "0.52.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" @@ -1637,74 +569,33 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"  [[package]]  name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc"  version = "0.52.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"  [[package]]  name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu"  version = "0.52.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"  [[package]]  name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm"  version = "0.52.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"  [[package]]  name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc"  version = "0.52.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"  [[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" +name = "wit-bindgen-rt" +version = "0.39.0"  source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"  dependencies = [ - "proc-macro2", - "quote", - "syn", + "bitflags",  ] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" @@ -9,4 +9,6 @@ edition = "2021"  chrono = "0.4.38"  clap = "4.5.9"  cron = "0.12.1" -sqlx = { version = "0.8.0", features = ["sqlite"] } +rusqlite = { version = "0.36.0", features = ["uuid", "chrono"] } +thiserror = "2.0.12" +uuid = { version = "1.17.0", features = ["v4"] }Binary files differ diff --git a/migrations/1.sql b/migrations/1.sql new file mode 100644 index 0000000..e540cac --- /dev/null +++ b/migrations/1.sql @@ -0,0 +1,36 @@ +PRAGMA foreign_keys = on; + +create table tasks ( +    id blob primary key, +    name text unique not null, +    -- TODO: multiple crons? +    cron text, +    archived integer not null default 0, +    description text +); + +create table categories ( +    id blob primary key, +    name text unique not null +); + +create table tasks_categories ( +    task_id blob not null, +    category_id blob not null, +    foreign key(task_id) references tasks(id) on delete cascade, +    foreign key(category_id) references categories(id) on delete cascade +); + +create table log ( +    id blob primary key, +    task_id blob not null, +    timestamp text not null, +    foreign key(task_id) references tasks(id) on delete cascade +); + +create table reminders ( +    id blob primary key, +    task_id blob not null, +    time_delta text not null, +    foreign key(task_id) references tasks(id) on delete cascade +); diff --git a/migrations/20240726140649_fj.sql b/migrations/20240726140649_fj.sql deleted file mode 100644 index 0afed32..0000000 --- a/migrations/20240726140649_fj.sql +++ /dev/null @@ -1,35 +0,0 @@ -PRAGMA foreign_keys = on; - -create table tasks ( -    id integer primary key, -    name text unique not null, -    cron text, -    archived integer not null default 0, -    description text -); - -create table categories ( -    id integer primary key, -    name text unique not null -); - -create table tasks_categories ( -    task_id integer, -    category_id integer, -    foreign key(task_id) references tasks(id), -    foreign key(category_id) references categories(id) -); - -create table log ( -    id integer primary key, -    task_id integer, -    datetime text not null, -    foreign key(task_id) references tasks(id) -); - -create table reminders ( -    id integer primary key, -    task_id integer, -    time_delta text not null, -    foreign key(task_id) references tasks(id) -); @@ -1,62 +1,323 @@ -use sqlx::sqlite::SqlitePool; +use std::{collections::HashSet, path::Path}; -use crate::{task::Task, Result}; +use chrono::NaiveDateTime; +use rusqlite::{params, params_from_iter, Connection, ToSql}; +use uuid::Uuid; -struct Db { -    pool: SqlitePool, -} +use crate::{ +    error::DatabaseOpenError, +    task::{Category, Log, Task}, +    Result, +}; + +struct Db(Connection);  impl Db { -    pub async fn create_task(&self, task: Task) -> Result<Task> { -        let id = sqlx::query!( -            "insert into tasks ( name, cron, archived, description ) values ( ?1, ?2, ?3, ?4 )", -            task.name, -            task.cron, -            task.archived, -            task.description -        ) -        .execute(&self.pool) -        .await? -        .last_insert_rowid(); - -        for category in task.categories.clone() { -            let category_id = sqlx::query!( -                "insert or ignore into categories ( name ) values ( ?1 )", -                category -            ) -            .execute(&self.pool) -            .await? -            .last_insert_rowid(); - -            sqlx::query!( +    pub fn create_connect_and_migrate( +        path: impl AsRef<Path>, +    ) -> std::result::Result<Self, DatabaseOpenError> { +        if let Some(dir) = path.as_ref().parent() { +            if dir.is_dir() { +            } else { +                std::fs::create_dir_all(dir)?; +            } +            let _file = std::fs::OpenOptions::new() +                .append(true) +                .create(true) +                .open(path.as_ref())?; +        } +        let url = format!( +            "{}", +            path.as_ref() +                .to_str() +                .ok_or(DatabaseOpenError::InvalidPath)? +        ); +        // let db = SqlitePool::connect(&url).await?; +        // migrate!().run(&db).await?; +        // Ok(Self { db }) +        let db = Connection::open(url)?; +        db.execute_batch(include_str!("../migrations/1.sql"))?; +        Ok(Self(db)) +    } + +    pub fn create_connect_memory() -> std::result::Result<Self, DatabaseOpenError> { +        let db = Connection::open_in_memory()?; +        db.execute_batch(include_str!("../migrations/1.sql"))?; +        Ok(Self(db)) +    } + +    pub fn create_task(&self, task: &Task) -> Result<()> { +        let task_id = Uuid::new_v4(); +        self.0.execute( +            "insert into tasks ( id, name, cron, archived, description ) values ( ?1, ?2, ?3, ?4, ?5 )", +            (task_id, &task.name, &task.cron, task.archived, &task.description), +        )?; + +        for category in &task.categories { +            let category_id = Uuid::new_v4(); +            self.0.execute( +                "insert or ignore into categories ( id, name ) values ( ?1, ?2 )", +                (category_id, category), +            )?; + +            self.0.execute( +                "insert into tasks_categories ( task_id, category_id ) values ( ?1, ?2 )", +                [task_id, category_id], +            )?; +        } + +        Ok(()) +    } + +    pub fn read_task(&self, name: impl AsRef<str>) -> Result<Task> { +        let name = name.as_ref(); +        let (task_id, mut task) = self +            .0 +            .prepare("select id, name, cron, archived, description from tasks where name = ?1")? +            .query_one([name], |row| { +                Ok(( +                    row.get::<_, Uuid>(0)?, +                    Task { +                        name: row.get(1)?, +                        cron: row.get(2)?, +                        archived: row.get(3)?, +                        description: row.get(4)?, +                        categories: HashSet::new(), +                    }, +                )) +            })?; + +        task.categories = self +            .0 +            .prepare("select name from tasks_categories join categories where task_id = ?1")? +            .query_map([task_id], |row| Ok(Category::new(row.get(0)?)))? +            .collect::<std::result::Result<HashSet<_>, _>>()?; + +        Ok(task) +    } + +    // TODO: filter +    pub fn read_tasks(&self, filter: Vec<TaskFilter>) -> Result<Vec<Task>> { +        let mut tasks = self +            .0 +            .prepare("select name, cron, archived, description, id from tasks")? +            .query_map([], |row| { +                Ok(( +                    row.get::<_, Uuid>(4)?, +                    Task { +                        name: row.get(0)?, +                        cron: row.get(1)?, +                        archived: row.get(2)?, +                        description: row.get(3)?, +                        categories: HashSet::new(), +                    }, +                )) +            })? +            .collect::<std::result::Result<Vec<_>, _>>()?; + +        for (task_id, task) in &mut tasks { +            let categories = self +                .0 +                .prepare("select name from tasks_categories join categories where task_id = ?1")? +                .query_map([*task_id], |row| Ok(Category::new(row.get(0)?)))? +                .collect::<std::result::Result<HashSet<_>, _>>()?; +            task.categories = categories; +        } + +        Ok(tasks.into_iter().map(|(_id, task)| task).collect()) +    } + +    pub fn update_task(&self, name: impl AsRef<str>, updated_task: &Task) -> Result<()> { +        let task_id = self.0 +            .prepare("update tasks set name = ?1, cron = ?2, archived = ?3, description = ?4 where name = ?5 returning id")?.query_one( (&updated_task.name, &updated_task.cron, updated_task.archived, &updated_task.description, name.as_ref()), |row| { +                Ok(row.get::<_, Uuid>(0)?) +            })?; +        self.0 +            .execute("delete from tasks_categories where task_id = ?1", [task_id])?; +        // TODO: clean up orphaned groups.... +        for category in &updated_task.categories { +            let category_id = Uuid::new_v4(); +            self.0.execute( +                "insert or ignore into categories ( id, name ) values ( ?1, ?2 )", +                (category_id, category), +            )?; + +            self.0.execute(                  "insert into tasks_categories ( task_id, category_id ) values ( ?1, ?2 )", -                id, -                category_id -            ) -            .execute(&self.pool) -            .await?; +                [task_id, category_id], +            )?;          } +        Ok(()) +    } -        Ok(task.add_id(id)) +    pub fn delete_task(&self, name: impl AsRef<str>) -> Result<()> { +        self.0 +            .execute("delete from tasks where name = ?1", [name.as_ref()])?; +        Ok(())      } -    pub async fn read_tasks(&self, select: Vec<TaskSelect>) -> Result<Vec<Task>> { -        Ok(sqlx::query!("select * from tasks") -            .fetch_all(&self.pool) -            .await?) +    pub fn create_log(&self, task_name: impl AsRef<str>, log: &Log) -> Result<()> { +        self.0.execute("insert into log ( id, task_id, timestamp ) values ( ?1, (select id from tasks where name = ?2), ?3 )", (log.id, task_name.as_ref(), log.timestamp))?; +        Ok(())      } -    pub async fn update_tasks(&self, select: Vec<TaskSelect>) -> Result<()> { -        todo!() +    pub fn read_logs(&self, filter: Vec<LogFilter>) -> Result<Vec<Log>> { +        let mut query = "select id, timestamp from log".to_string(); + +        if !filter.is_empty() { +            query.push_str(" where ") +        } +        query.push_str( +            &filter +                .iter() +                .map(|filter| filter.where_clause()) +                .collect::<Vec<_>>() +                .join(", "), +        ); + +        let logs = self +            .0 +            .prepare(&query)? +            .query_map(params_from_iter(filter), |row| { +                Ok(Log { +                    id: row.get(0)?, +                    timestamp: row.get(1)?, +                }) +            })? +            .collect::<std::result::Result<Vec<_>, _>>()?; + +        Ok(logs)      } -    pub async fn delete_tasks(&self, select: Vec<TaskSelect>) -> Result<()> { -        todo!() +    pub fn delete_log(&self, log: &Log) -> Result<()> { +        self.0.execute("delete from logs where id = ?1", [log.id])?; +        Ok(())      }  } -pub enum TaskSelect { -    Name(String), +pub enum TaskFilter {      Archived(bool),      Category(String),  } + +impl ToSql for TaskFilter { +    fn to_sql(&self) -> rusqlite::Result<rusqlite::types::ToSqlOutput<'_>> { +        match self { +            TaskFilter::Archived(a) => a.to_sql(), +            TaskFilter::Category(c) => c.to_sql(), +        } +    } +} + +pub enum LogFilter { +    Task(String), +    Before(NaiveDateTime), +    After(NaiveDateTime), +} + +impl LogFilter { +    fn where_clause(&self) -> &'static str { +        match self { +            LogFilter::Task(_) => "task_id = (select id from tasks where name = ?)", +            LogFilter::Before(naive_date_time) => "timestamp < ?", +            LogFilter::After(naive_date_time) => "timestamp > ?", +        } +    } +} + +impl ToSql for LogFilter { +    fn to_sql(&self) -> rusqlite::Result<rusqlite::types::ToSqlOutput<'_>> { +        match self { +            LogFilter::Task(n) => n.to_sql(), +            LogFilter::Before(naive_date_time) => naive_date_time.to_sql(), +            LogFilter::After(naive_date_time) => naive_date_time.to_sql(), +        } +    } +} + +#[cfg(test)] +mod tests { +    use std::collections::HashSet; + +    use crate::task::{Category, Task}; + +    use super::Db; + +    #[test] +    fn create_task() { +        let db = Db::create_connect_memory().unwrap(); + +        let task = Task::new( +            "piano".to_string(), +            None, +            Some("practice piano".to_string()), +            Some(HashSet::from([Category::new("music".to_string())])), +        ); + +        db.create_task(&task).unwrap(); +    } + +    #[test] +    fn read_task() { +        let db = Db::create_connect_memory().unwrap(); + +        let task = Task::new( +            "piano".to_string(), +            None, +            Some("practice piano".to_string()), +            Some(HashSet::from([Category::new("music".to_string())])), +        ); + +        db.create_task(&task).unwrap(); + +        assert_eq!(task, db.read_task("piano").unwrap()); +    } + +    #[test] +    fn read_tasks() { +        let db = Db::create_connect_memory().unwrap(); + +        let piano = Task::new( +            "piano".to_string(), +            None, +            Some("practice piano".to_string()), +            Some(HashSet::from([Category::new("music".to_string())])), +        ); + +        db.create_task(&piano).unwrap(); + +        let german = Task::new( +            "german".to_string(), +            None, +            Some("study german".to_string()), +            None, +        ); + +        db.create_task(&german).unwrap(); + +        assert_eq!(vec![piano, german], db.read_tasks(Vec::new()).unwrap()); +    } + +    // TODO: task orderings: by day, by week, by what's most urgent. + +    #[test] +    fn filter_tasks() {} + +    #[test] +    fn update_task() {} + +    #[test] +    fn delete_task() {} + +    #[test] +    fn create_log() {} + +    #[test] +    fn read_logs() {} + +    #[test] +    fn filter_logs() {} + +    #[test] +    fn delete_log() {} +} diff --git a/src/error.rs b/src/error.rs index 6716b58..580355e 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,9 +1,17 @@ +use thiserror::Error; + +#[derive(Debug, Error)]  pub enum Error { -    Database(sqlx::Error), +    #[error("db: {0}")] +    Db(#[from] rusqlite::Error),  } -impl From<sqlx::Error> for Error { -    fn from(e: sqlx::Error) -> Self { -        Error::Database(e) -    } +#[derive(Debug, Error)] +pub enum DatabaseOpenError { +    #[error("invalid path")] +    InvalidPath, +    #[error("io: {0}")] +    Io(#[from] std::io::Error), +    #[error("db: {0}")] +    Db(#[from] rusqlite::Error),  } @@ -1,7 +1,7 @@  mod db;  mod error;  mod task; -mod timestamp; -pub use error::Error; +pub use error::*; +pub use task::*;  pub type Result<T> = std::result::Result<T, Error>; diff --git a/src/task.rs b/src/task.rs index 59aa502..ce2e7e6 100644 --- a/src/task.rs +++ b/src/task.rs @@ -1,25 +1,23 @@  use std::{ -    borrow::{Borrow, Cow},      collections::HashSet, +    ops::{Deref, DerefMut},      str::FromStr,  }; -use chrono::{NaiveDateTime, TimeDelta}; -use sqlx::{ -    encode::IsNull, -    prelude::FromRow, -    sqlite::{SqliteArgumentValue, SqliteTypeInfo, SqliteValue}, -    Decode, Sqlite, Type, TypeInfo, Value, ValueRef, +use chrono::{Local, NaiveDateTime, TimeDelta}; +use rusqlite::{ +    types::{FromSql, FromSqlError, ToSqlOutput, Value}, +    ToSql,  }; +use uuid::Uuid; -#[derive(FromRow)] +#[derive(PartialEq, Eq, Clone, Debug)]  pub struct Task { -    id: Option<i64>, -    pub name: String, -    pub cron: Option<Schedule>, -    pub archived: bool, -    pub description: Option<String>, -    pub categories: HashSet<String>, +    pub(crate) name: String, +    pub(crate) cron: Option<Schedule>, +    pub(crate) archived: bool, +    pub(crate) description: Option<String>, +    pub(crate) categories: HashSet<Category>,  }  impl Task { @@ -27,10 +25,9 @@ impl Task {          name: String,          cron: Option<Schedule>,          description: Option<String>, -        categories: Option<HashSet<String>>, +        categories: Option<HashSet<Category>>,      ) -> Self {          Self { -            id: None,              name,              cron,              archived: false, @@ -38,50 +35,57 @@ impl Task {              categories: categories.unwrap_or_else(|| HashSet::new()),          }      } +} -    pub fn id(&self) -> Option<i64> { -        self.id -    } +#[derive(PartialEq, Eq, Clone, Debug)] +pub struct Schedule(cron::Schedule); -    pub fn add_id(mut self, id: i64) -> Self { -        self.id = Some(id); -        self +impl FromSql for Schedule { +    fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult<Self> { +        let schedule = value.as_str()?; +        let schedule = +            cron::Schedule::from_str(schedule).map_err(|e| FromSqlError::Other(Box::new(e)))?; +        Ok(Self(schedule))      }  } -pub struct Schedule(cron::Schedule); +impl ToSql for Schedule { +    fn to_sql(&self) -> rusqlite::Result<rusqlite::types::ToSqlOutput<'_>> { +        Ok(rusqlite::types::ToSqlOutput::Owned( +            rusqlite::types::Value::Text(self.0.to_string()), +        )) +    } +} -impl sqlx::Encode<'_, Sqlite> for Schedule { -    fn encode_by_ref( -        &self, -        buf: &mut <Sqlite as sqlx::Database>::ArgumentBuffer<'_>, -    ) -> Result<sqlx::encode::IsNull, sqlx::error::BoxDynError> { -        let schedule = &self.0; -        let schedule = schedule.to_string(); -        buf.push(SqliteArgumentValue::Text(Cow::Owned(schedule))); +#[repr(transparent)] +#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Hash)] +pub struct Category(String); -        Ok(IsNull::No) +impl ToSql for Category { +    fn to_sql(&self) -> rusqlite::Result<rusqlite::types::ToSqlOutput<'_>> { +        Ok(ToSqlOutput::Owned(Value::Text(self.0.clone())))      }  } -impl sqlx::Decode<'_, Sqlite> for Schedule { -    fn decode( -        value: <Sqlite as sqlx::Database>::ValueRef<'_>, -    ) -> Result<Self, sqlx::error::BoxDynError> { -        let schedule = Decode::<Sqlite>::decode(value)?; -        let schedule = cron::Schedule::from_str(schedule)?; -        Ok(Self(schedule)) +impl FromSql for Category { +    fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult<Self> { +        Ok(Self(value.as_str()?.to_string()))      }  } -impl Type<Sqlite> for Schedule { -    fn type_info() -> <Sqlite as sqlx::Database>::TypeInfo { -        <&str as Type<Sqlite>>::type_info() +impl Deref for Category { +    type Target = String; + +    fn deref(&self) -> &Self::Target { +        &self.0      }  } -#[repr(transparent)] -pub struct Category(String); +impl DerefMut for Category { +    fn deref_mut(&mut self) -> &mut Self::Target { +        &mut self.0 +    } +}  impl Category {      pub fn new(category: String) -> Self { @@ -89,11 +93,25 @@ impl Category {      }  } -pub struct Log(NaiveDateTime); +#[derive(Debug, Clone, Copy)] +pub struct Log { +    pub(crate) id: Uuid, +    pub(crate) timestamp: NaiveDateTime, +}  impl Log {      pub fn new(datetime: NaiveDateTime) -> Self { -        Self(datetime) +        Self { +            id: Uuid::new_v4(), +            timestamp: datetime, +        } +    } + +    pub fn new_now() -> Self { +        Self { +            id: Uuid::new_v4(), +            timestamp: Local::now().naive_local(), +        }      }  } diff --git a/src/timestamp.rs b/src/timestamp.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/timestamp.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tasks.rs b/tasks.rs deleted file mode 100644 index 240fed7..0000000 --- a/tasks.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub struct Task { -    id: usize, -    name: String, -} | 
