├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── banner.png ├── demo.png ├── demo2.png ├── events.txt ├── future.txt ├── src ├── events.txt ├── main.rs └── tasks.txt ├── tasks.txt └── todo.txt /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | *.bin 3 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "ahash" 22 | version = "0.8.7" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" 25 | dependencies = [ 26 | "cfg-if", 27 | "getrandom", 28 | "once_cell", 29 | "version_check", 30 | "zerocopy", 31 | ] 32 | 33 | [[package]] 34 | name = "aho-corasick" 35 | version = "1.1.3" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 38 | dependencies = [ 39 | "memchr", 40 | ] 41 | 42 | [[package]] 43 | name = "allocator-api2" 44 | version = "0.2.16" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" 47 | 48 | [[package]] 49 | name = "android-tzdata" 50 | version = "0.1.1" 51 | source = "registry+https://github.com/rust-lang/crates.io-index" 52 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 53 | 54 | [[package]] 55 | name = "android_system_properties" 56 | version = "0.1.5" 57 | source = "registry+https://github.com/rust-lang/crates.io-index" 58 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 59 | dependencies = [ 60 | "libc", 61 | ] 62 | 63 | [[package]] 64 | name = "anstream" 65 | version = "0.6.5" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" 68 | dependencies = [ 69 | "anstyle", 70 | "anstyle-parse", 71 | "anstyle-query", 72 | "anstyle-wincon", 73 | "colorchoice", 74 | "utf8parse", 75 | ] 76 | 77 | [[package]] 78 | name = "anstyle" 79 | version = "1.0.4" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" 82 | 83 | [[package]] 84 | name = "anstyle-parse" 85 | version = "0.2.3" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" 88 | dependencies = [ 89 | "utf8parse", 90 | ] 91 | 92 | [[package]] 93 | name = "anstyle-query" 94 | version = "1.0.2" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" 97 | dependencies = [ 98 | "windows-sys 0.52.0", 99 | ] 100 | 101 | [[package]] 102 | name = "anstyle-wincon" 103 | version = "3.0.2" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" 106 | dependencies = [ 107 | "anstyle", 108 | "windows-sys 0.52.0", 109 | ] 110 | 111 | [[package]] 112 | name = "autocfg" 113 | version = "1.1.0" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 116 | 117 | [[package]] 118 | name = "backtrace" 119 | version = "0.3.71" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 122 | dependencies = [ 123 | "addr2line", 124 | "cc", 125 | "cfg-if", 126 | "libc", 127 | "miniz_oxide", 128 | "object", 129 | "rustc-demangle", 130 | ] 131 | 132 | [[package]] 133 | name = "base64" 134 | version = "0.22.0" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" 137 | 138 | [[package]] 139 | name = "bitflags" 140 | version = "1.3.2" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 143 | 144 | [[package]] 145 | name = "bitflags" 146 | version = "2.4.1" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" 149 | 150 | [[package]] 151 | name = "bumpalo" 152 | version = "3.14.0" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" 155 | 156 | [[package]] 157 | name = "byteorder" 158 | version = "1.5.0" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 161 | 162 | [[package]] 163 | name = "bytes" 164 | version = "1.6.0" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 167 | 168 | [[package]] 169 | name = "cassowary" 170 | version = "0.3.0" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" 173 | 174 | [[package]] 175 | name = "cc" 176 | version = "1.0.90" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" 179 | 180 | [[package]] 181 | name = "cfg-if" 182 | version = "1.0.0" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 185 | 186 | [[package]] 187 | name = "chrono" 188 | version = "0.4.31" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" 191 | dependencies = [ 192 | "android-tzdata", 193 | "iana-time-zone", 194 | "js-sys", 195 | "num-traits", 196 | "wasm-bindgen", 197 | "windows-targets 0.48.5", 198 | ] 199 | 200 | [[package]] 201 | name = "clap" 202 | version = "4.4.12" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d" 205 | dependencies = [ 206 | "clap_builder", 207 | "clap_derive", 208 | ] 209 | 210 | [[package]] 211 | name = "clap_builder" 212 | version = "4.4.12" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" 215 | dependencies = [ 216 | "anstream", 217 | "anstyle", 218 | "clap_lex", 219 | "strsim", 220 | ] 221 | 222 | [[package]] 223 | name = "clap_derive" 224 | version = "4.4.7" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" 227 | dependencies = [ 228 | "heck", 229 | "proc-macro2", 230 | "quote", 231 | "syn 2.0.59", 232 | ] 233 | 234 | [[package]] 235 | name = "clap_lex" 236 | version = "0.6.0" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" 239 | 240 | [[package]] 241 | name = "colorchoice" 242 | version = "1.0.0" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" 245 | 246 | [[package]] 247 | name = "colored" 248 | version = "2.1.0" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" 251 | dependencies = [ 252 | "lazy_static", 253 | "windows-sys 0.48.0", 254 | ] 255 | 256 | [[package]] 257 | name = "console" 258 | version = "0.15.7" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" 261 | dependencies = [ 262 | "encode_unicode", 263 | "lazy_static", 264 | "libc", 265 | "unicode-width", 266 | "windows-sys 0.45.0", 267 | ] 268 | 269 | [[package]] 270 | name = "core-foundation" 271 | version = "0.9.4" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 274 | dependencies = [ 275 | "core-foundation-sys", 276 | "libc", 277 | ] 278 | 279 | [[package]] 280 | name = "core-foundation-sys" 281 | version = "0.8.6" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 284 | 285 | [[package]] 286 | name = "crossterm" 287 | version = "0.27.0" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" 290 | dependencies = [ 291 | "bitflags 2.4.1", 292 | "crossterm_winapi", 293 | "libc", 294 | "mio", 295 | "parking_lot", 296 | "signal-hook", 297 | "signal-hook-mio", 298 | "winapi", 299 | ] 300 | 301 | [[package]] 302 | name = "crossterm_winapi" 303 | version = "0.9.1" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 306 | dependencies = [ 307 | "winapi", 308 | ] 309 | 310 | [[package]] 311 | name = "cssparser" 312 | version = "0.31.2" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "5b3df4f93e5fbbe73ec01ec8d3f68bba73107993a5b1e7519273c32db9b0d5be" 315 | dependencies = [ 316 | "cssparser-macros", 317 | "dtoa-short", 318 | "itoa", 319 | "phf 0.11.2", 320 | "smallvec", 321 | ] 322 | 323 | [[package]] 324 | name = "cssparser-macros" 325 | version = "0.6.1" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 328 | dependencies = [ 329 | "quote", 330 | "syn 2.0.59", 331 | ] 332 | 333 | [[package]] 334 | name = "date_time_parser" 335 | version = "0.1.1" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "f86cad3e692d9b556cb8b64357f50f3b1b8411f3c8999f0bb94523991b5ded6c" 338 | dependencies = [ 339 | "chrono", 340 | "regex", 341 | ] 342 | 343 | [[package]] 344 | name = "derive_more" 345 | version = "0.99.17" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 348 | dependencies = [ 349 | "proc-macro2", 350 | "quote", 351 | "syn 1.0.109", 352 | ] 353 | 354 | [[package]] 355 | name = "dtoa" 356 | version = "1.0.9" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" 359 | 360 | [[package]] 361 | name = "dtoa-short" 362 | version = "0.3.4" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" 365 | dependencies = [ 366 | "dtoa", 367 | ] 368 | 369 | [[package]] 370 | name = "ego-tree" 371 | version = "0.6.2" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591" 374 | 375 | [[package]] 376 | name = "either" 377 | version = "1.9.0" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" 380 | 381 | [[package]] 382 | name = "encode_unicode" 383 | version = "0.3.6" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 386 | 387 | [[package]] 388 | name = "encoding_rs" 389 | version = "0.8.34" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" 392 | dependencies = [ 393 | "cfg-if", 394 | ] 395 | 396 | [[package]] 397 | name = "equivalent" 398 | version = "1.0.1" 399 | source = "registry+https://github.com/rust-lang/crates.io-index" 400 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 401 | 402 | [[package]] 403 | name = "errno" 404 | version = "0.3.8" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 407 | dependencies = [ 408 | "libc", 409 | "windows-sys 0.52.0", 410 | ] 411 | 412 | [[package]] 413 | name = "event_parser" 414 | version = "0.1.1" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "4e841f083fbbc766c13ceee32aa64908fa95d9cee7ae6eb6d0888d7479659a61" 417 | dependencies = [ 418 | "chrono", 419 | "date_time_parser", 420 | "icalendar 0.10.0", 421 | "iso8601 0.4.2", 422 | "regex", 423 | ] 424 | 425 | [[package]] 426 | name = "fastrand" 427 | version = "2.0.2" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" 430 | 431 | [[package]] 432 | name = "fnv" 433 | version = "1.0.7" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 436 | 437 | [[package]] 438 | name = "foreign-types" 439 | version = "0.3.2" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 442 | dependencies = [ 443 | "foreign-types-shared", 444 | ] 445 | 446 | [[package]] 447 | name = "foreign-types-shared" 448 | version = "0.1.1" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 451 | 452 | [[package]] 453 | name = "form_urlencoded" 454 | version = "1.2.1" 455 | source = "registry+https://github.com/rust-lang/crates.io-index" 456 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 457 | dependencies = [ 458 | "percent-encoding", 459 | ] 460 | 461 | [[package]] 462 | name = "futf" 463 | version = "0.1.5" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 466 | dependencies = [ 467 | "mac", 468 | "new_debug_unreachable", 469 | ] 470 | 471 | [[package]] 472 | name = "futures-channel" 473 | version = "0.3.30" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 476 | dependencies = [ 477 | "futures-core", 478 | "futures-sink", 479 | ] 480 | 481 | [[package]] 482 | name = "futures-core" 483 | version = "0.3.30" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 486 | 487 | [[package]] 488 | name = "futures-io" 489 | version = "0.3.30" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 492 | 493 | [[package]] 494 | name = "futures-macro" 495 | version = "0.3.30" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 498 | dependencies = [ 499 | "proc-macro2", 500 | "quote", 501 | "syn 2.0.59", 502 | ] 503 | 504 | [[package]] 505 | name = "futures-sink" 506 | version = "0.3.30" 507 | source = "registry+https://github.com/rust-lang/crates.io-index" 508 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 509 | 510 | [[package]] 511 | name = "futures-task" 512 | version = "0.3.30" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 515 | 516 | [[package]] 517 | name = "futures-util" 518 | version = "0.3.30" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 521 | dependencies = [ 522 | "futures-core", 523 | "futures-io", 524 | "futures-macro", 525 | "futures-sink", 526 | "futures-task", 527 | "memchr", 528 | "pin-project-lite", 529 | "pin-utils", 530 | "slab", 531 | ] 532 | 533 | [[package]] 534 | name = "fxhash" 535 | version = "0.2.1" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 538 | dependencies = [ 539 | "byteorder", 540 | ] 541 | 542 | [[package]] 543 | name = "getopts" 544 | version = "0.2.21" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" 547 | dependencies = [ 548 | "unicode-width", 549 | ] 550 | 551 | [[package]] 552 | name = "getrandom" 553 | version = "0.2.12" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" 556 | dependencies = [ 557 | "cfg-if", 558 | "js-sys", 559 | "libc", 560 | "wasi", 561 | "wasm-bindgen", 562 | ] 563 | 564 | [[package]] 565 | name = "gimli" 566 | version = "0.28.1" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 569 | 570 | [[package]] 571 | name = "h2" 572 | version = "0.4.4" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" 575 | dependencies = [ 576 | "bytes", 577 | "fnv", 578 | "futures-core", 579 | "futures-sink", 580 | "futures-util", 581 | "http", 582 | "indexmap", 583 | "slab", 584 | "tokio", 585 | "tokio-util", 586 | "tracing", 587 | ] 588 | 589 | [[package]] 590 | name = "hashbrown" 591 | version = "0.14.3" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 594 | dependencies = [ 595 | "ahash", 596 | "allocator-api2", 597 | ] 598 | 599 | [[package]] 600 | name = "heck" 601 | version = "0.4.1" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 604 | 605 | [[package]] 606 | name = "hermit-abi" 607 | version = "0.3.9" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 610 | 611 | [[package]] 612 | name = "html5ever" 613 | version = "0.26.0" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" 616 | dependencies = [ 617 | "log", 618 | "mac", 619 | "markup5ever", 620 | "proc-macro2", 621 | "quote", 622 | "syn 1.0.109", 623 | ] 624 | 625 | [[package]] 626 | name = "http" 627 | version = "1.1.0" 628 | source = "registry+https://github.com/rust-lang/crates.io-index" 629 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 630 | dependencies = [ 631 | "bytes", 632 | "fnv", 633 | "itoa", 634 | ] 635 | 636 | [[package]] 637 | name = "http-body" 638 | version = "1.0.0" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 641 | dependencies = [ 642 | "bytes", 643 | "http", 644 | ] 645 | 646 | [[package]] 647 | name = "http-body-util" 648 | version = "0.1.1" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" 651 | dependencies = [ 652 | "bytes", 653 | "futures-core", 654 | "http", 655 | "http-body", 656 | "pin-project-lite", 657 | ] 658 | 659 | [[package]] 660 | name = "httparse" 661 | version = "1.8.0" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 664 | 665 | [[package]] 666 | name = "hyper" 667 | version = "1.3.1" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" 670 | dependencies = [ 671 | "bytes", 672 | "futures-channel", 673 | "futures-util", 674 | "h2", 675 | "http", 676 | "http-body", 677 | "httparse", 678 | "itoa", 679 | "pin-project-lite", 680 | "smallvec", 681 | "tokio", 682 | "want", 683 | ] 684 | 685 | [[package]] 686 | name = "hyper-tls" 687 | version = "0.6.0" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 690 | dependencies = [ 691 | "bytes", 692 | "http-body-util", 693 | "hyper", 694 | "hyper-util", 695 | "native-tls", 696 | "tokio", 697 | "tokio-native-tls", 698 | "tower-service", 699 | ] 700 | 701 | [[package]] 702 | name = "hyper-util" 703 | version = "0.1.3" 704 | source = "registry+https://github.com/rust-lang/crates.io-index" 705 | checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" 706 | dependencies = [ 707 | "bytes", 708 | "futures-channel", 709 | "futures-util", 710 | "http", 711 | "http-body", 712 | "hyper", 713 | "pin-project-lite", 714 | "socket2", 715 | "tokio", 716 | "tower", 717 | "tower-service", 718 | "tracing", 719 | ] 720 | 721 | [[package]] 722 | name = "iana-time-zone" 723 | version = "0.1.59" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" 726 | dependencies = [ 727 | "android_system_properties", 728 | "core-foundation-sys", 729 | "iana-time-zone-haiku", 730 | "js-sys", 731 | "wasm-bindgen", 732 | "windows-core", 733 | ] 734 | 735 | [[package]] 736 | name = "iana-time-zone-haiku" 737 | version = "0.1.2" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 740 | dependencies = [ 741 | "cc", 742 | ] 743 | 744 | [[package]] 745 | name = "icalendar" 746 | version = "0.10.0" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "a9ef924cc883333ecdc23b8c4a677119ec6a2db9ef7748a2ae74e77c91ef14df" 749 | dependencies = [ 750 | "chrono", 751 | "uuid 0.8.2", 752 | ] 753 | 754 | [[package]] 755 | name = "icalendar" 756 | version = "0.16.0" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "aa4ffbcf3325ae94554c5259ce0b8907d37133c066cb3d424a2fa96aa1f10088" 759 | dependencies = [ 760 | "chrono", 761 | "iso8601 0.6.1", 762 | "nom", 763 | "uuid 1.8.0", 764 | ] 765 | 766 | [[package]] 767 | name = "idna" 768 | version = "0.5.0" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 771 | dependencies = [ 772 | "unicode-bidi", 773 | "unicode-normalization", 774 | ] 775 | 776 | [[package]] 777 | name = "indexmap" 778 | version = "2.2.6" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 781 | dependencies = [ 782 | "equivalent", 783 | "hashbrown", 784 | ] 785 | 786 | [[package]] 787 | name = "indicatif" 788 | version = "0.17.7" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" 791 | dependencies = [ 792 | "console", 793 | "instant", 794 | "number_prefix", 795 | "portable-atomic", 796 | "unicode-width", 797 | ] 798 | 799 | [[package]] 800 | name = "indoc" 801 | version = "2.0.4" 802 | source = "registry+https://github.com/rust-lang/crates.io-index" 803 | checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" 804 | 805 | [[package]] 806 | name = "instant" 807 | version = "0.1.12" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 810 | dependencies = [ 811 | "cfg-if", 812 | ] 813 | 814 | [[package]] 815 | name = "ipnet" 816 | version = "2.9.0" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" 819 | 820 | [[package]] 821 | name = "iso8601" 822 | version = "0.4.2" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "e5b94fbeb759754d87e1daea745bc8efd3037cd16980331fe1d1524c9a79ce96" 825 | dependencies = [ 826 | "nom", 827 | ] 828 | 829 | [[package]] 830 | name = "iso8601" 831 | version = "0.6.1" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | checksum = "924e5d73ea28f59011fec52a0d12185d496a9b075d360657aed2a5707f701153" 834 | dependencies = [ 835 | "nom", 836 | ] 837 | 838 | [[package]] 839 | name = "itertools" 840 | version = "0.12.0" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" 843 | dependencies = [ 844 | "either", 845 | ] 846 | 847 | [[package]] 848 | name = "itoa" 849 | version = "1.0.10" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" 852 | 853 | [[package]] 854 | name = "js-sys" 855 | version = "0.3.66" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" 858 | dependencies = [ 859 | "wasm-bindgen", 860 | ] 861 | 862 | [[package]] 863 | name = "lazy_static" 864 | version = "1.4.0" 865 | source = "registry+https://github.com/rust-lang/crates.io-index" 866 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 867 | 868 | [[package]] 869 | name = "libc" 870 | version = "0.2.151" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" 873 | 874 | [[package]] 875 | name = "linux-raw-sys" 876 | version = "0.4.13" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" 879 | 880 | [[package]] 881 | name = "lock_api" 882 | version = "0.4.11" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 885 | dependencies = [ 886 | "autocfg", 887 | "scopeguard", 888 | ] 889 | 890 | [[package]] 891 | name = "log" 892 | version = "0.4.20" 893 | source = "registry+https://github.com/rust-lang/crates.io-index" 894 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 895 | 896 | [[package]] 897 | name = "lru" 898 | version = "0.12.1" 899 | source = "registry+https://github.com/rust-lang/crates.io-index" 900 | checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" 901 | dependencies = [ 902 | "hashbrown", 903 | ] 904 | 905 | [[package]] 906 | name = "mac" 907 | version = "0.1.1" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 910 | 911 | [[package]] 912 | name = "markup5ever" 913 | version = "0.11.0" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" 916 | dependencies = [ 917 | "log", 918 | "phf 0.10.1", 919 | "phf_codegen", 920 | "string_cache", 921 | "string_cache_codegen", 922 | "tendril", 923 | ] 924 | 925 | [[package]] 926 | name = "memchr" 927 | version = "2.7.1" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 930 | 931 | [[package]] 932 | name = "mime" 933 | version = "0.3.17" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 936 | 937 | [[package]] 938 | name = "minimal-lexical" 939 | version = "0.2.1" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 942 | 943 | [[package]] 944 | name = "miniz_oxide" 945 | version = "0.7.2" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 948 | dependencies = [ 949 | "adler", 950 | ] 951 | 952 | [[package]] 953 | name = "mio" 954 | version = "0.8.10" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" 957 | dependencies = [ 958 | "libc", 959 | "log", 960 | "wasi", 961 | "windows-sys 0.48.0", 962 | ] 963 | 964 | [[package]] 965 | name = "native-tls" 966 | version = "0.2.11" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 969 | dependencies = [ 970 | "lazy_static", 971 | "libc", 972 | "log", 973 | "openssl", 974 | "openssl-probe", 975 | "openssl-sys", 976 | "schannel", 977 | "security-framework", 978 | "security-framework-sys", 979 | "tempfile", 980 | ] 981 | 982 | [[package]] 983 | name = "new_debug_unreachable" 984 | version = "1.0.6" 985 | source = "registry+https://github.com/rust-lang/crates.io-index" 986 | checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 987 | 988 | [[package]] 989 | name = "nom" 990 | version = "7.1.3" 991 | source = "registry+https://github.com/rust-lang/crates.io-index" 992 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 993 | dependencies = [ 994 | "memchr", 995 | "minimal-lexical", 996 | ] 997 | 998 | [[package]] 999 | name = "num-traits" 1000 | version = "0.2.17" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" 1003 | dependencies = [ 1004 | "autocfg", 1005 | ] 1006 | 1007 | [[package]] 1008 | name = "num_cpus" 1009 | version = "1.16.0" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 1012 | dependencies = [ 1013 | "hermit-abi", 1014 | "libc", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "number_prefix" 1019 | version = "0.4.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 1022 | 1023 | [[package]] 1024 | name = "object" 1025 | version = "0.32.2" 1026 | source = "registry+https://github.com/rust-lang/crates.io-index" 1027 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 1028 | dependencies = [ 1029 | "memchr", 1030 | ] 1031 | 1032 | [[package]] 1033 | name = "ollama-rs" 1034 | version = "0.1.9" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "53581ab78176ff3ae830a43236f485fc90d7f472d0081dddc45d8605e1301954" 1037 | dependencies = [ 1038 | "reqwest", 1039 | "serde", 1040 | "serde_json", 1041 | "tokio", 1042 | "tokio-stream", 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "once_cell" 1047 | version = "1.19.0" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1050 | 1051 | [[package]] 1052 | name = "openssl" 1053 | version = "0.10.64" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" 1056 | dependencies = [ 1057 | "bitflags 2.4.1", 1058 | "cfg-if", 1059 | "foreign-types", 1060 | "libc", 1061 | "once_cell", 1062 | "openssl-macros", 1063 | "openssl-sys", 1064 | ] 1065 | 1066 | [[package]] 1067 | name = "openssl-macros" 1068 | version = "0.1.1" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1071 | dependencies = [ 1072 | "proc-macro2", 1073 | "quote", 1074 | "syn 2.0.59", 1075 | ] 1076 | 1077 | [[package]] 1078 | name = "openssl-probe" 1079 | version = "0.1.5" 1080 | source = "registry+https://github.com/rust-lang/crates.io-index" 1081 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1082 | 1083 | [[package]] 1084 | name = "openssl-sys" 1085 | version = "0.9.102" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" 1088 | dependencies = [ 1089 | "cc", 1090 | "libc", 1091 | "pkg-config", 1092 | "vcpkg", 1093 | ] 1094 | 1095 | [[package]] 1096 | name = "parking_lot" 1097 | version = "0.12.1" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1100 | dependencies = [ 1101 | "lock_api", 1102 | "parking_lot_core", 1103 | ] 1104 | 1105 | [[package]] 1106 | name = "parking_lot_core" 1107 | version = "0.9.9" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 1110 | dependencies = [ 1111 | "cfg-if", 1112 | "libc", 1113 | "redox_syscall", 1114 | "smallvec", 1115 | "windows-targets 0.48.5", 1116 | ] 1117 | 1118 | [[package]] 1119 | name = "paste" 1120 | version = "1.0.14" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" 1123 | 1124 | [[package]] 1125 | name = "percent-encoding" 1126 | version = "2.3.1" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1129 | 1130 | [[package]] 1131 | name = "phf" 1132 | version = "0.10.1" 1133 | source = "registry+https://github.com/rust-lang/crates.io-index" 1134 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 1135 | dependencies = [ 1136 | "phf_shared 0.10.0", 1137 | ] 1138 | 1139 | [[package]] 1140 | name = "phf" 1141 | version = "0.11.2" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 1144 | dependencies = [ 1145 | "phf_macros", 1146 | "phf_shared 0.11.2", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "phf_codegen" 1151 | version = "0.10.0" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" 1154 | dependencies = [ 1155 | "phf_generator 0.10.0", 1156 | "phf_shared 0.10.0", 1157 | ] 1158 | 1159 | [[package]] 1160 | name = "phf_generator" 1161 | version = "0.10.0" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 1164 | dependencies = [ 1165 | "phf_shared 0.10.0", 1166 | "rand", 1167 | ] 1168 | 1169 | [[package]] 1170 | name = "phf_generator" 1171 | version = "0.11.2" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" 1174 | dependencies = [ 1175 | "phf_shared 0.11.2", 1176 | "rand", 1177 | ] 1178 | 1179 | [[package]] 1180 | name = "phf_macros" 1181 | version = "0.11.2" 1182 | source = "registry+https://github.com/rust-lang/crates.io-index" 1183 | checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" 1184 | dependencies = [ 1185 | "phf_generator 0.11.2", 1186 | "phf_shared 0.11.2", 1187 | "proc-macro2", 1188 | "quote", 1189 | "syn 2.0.59", 1190 | ] 1191 | 1192 | [[package]] 1193 | name = "phf_shared" 1194 | version = "0.10.0" 1195 | source = "registry+https://github.com/rust-lang/crates.io-index" 1196 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 1197 | dependencies = [ 1198 | "siphasher", 1199 | ] 1200 | 1201 | [[package]] 1202 | name = "phf_shared" 1203 | version = "0.11.2" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 1206 | dependencies = [ 1207 | "siphasher", 1208 | ] 1209 | 1210 | [[package]] 1211 | name = "pin-project" 1212 | version = "1.1.5" 1213 | source = "registry+https://github.com/rust-lang/crates.io-index" 1214 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 1215 | dependencies = [ 1216 | "pin-project-internal", 1217 | ] 1218 | 1219 | [[package]] 1220 | name = "pin-project-internal" 1221 | version = "1.1.5" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 1224 | dependencies = [ 1225 | "proc-macro2", 1226 | "quote", 1227 | "syn 2.0.59", 1228 | ] 1229 | 1230 | [[package]] 1231 | name = "pin-project-lite" 1232 | version = "0.2.14" 1233 | source = "registry+https://github.com/rust-lang/crates.io-index" 1234 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 1235 | 1236 | [[package]] 1237 | name = "pin-utils" 1238 | version = "0.1.0" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1241 | 1242 | [[package]] 1243 | name = "pkg-config" 1244 | version = "0.3.30" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 1247 | 1248 | [[package]] 1249 | name = "portable-atomic" 1250 | version = "1.6.0" 1251 | source = "registry+https://github.com/rust-lang/crates.io-index" 1252 | checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" 1253 | 1254 | [[package]] 1255 | name = "ppv-lite86" 1256 | version = "0.2.17" 1257 | source = "registry+https://github.com/rust-lang/crates.io-index" 1258 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1259 | 1260 | [[package]] 1261 | name = "precomputed-hash" 1262 | version = "0.1.1" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 1265 | 1266 | [[package]] 1267 | name = "proc-macro2" 1268 | version = "1.0.80" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "a56dea16b0a29e94408b9aa5e2940a4eedbd128a1ba20e8f7ae60fd3d465af0e" 1271 | dependencies = [ 1272 | "unicode-ident", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "quote" 1277 | version = "1.0.35" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" 1280 | dependencies = [ 1281 | "proc-macro2", 1282 | ] 1283 | 1284 | [[package]] 1285 | name = "rand" 1286 | version = "0.8.5" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1289 | dependencies = [ 1290 | "libc", 1291 | "rand_chacha", 1292 | "rand_core", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "rand_chacha" 1297 | version = "0.3.1" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1300 | dependencies = [ 1301 | "ppv-lite86", 1302 | "rand_core", 1303 | ] 1304 | 1305 | [[package]] 1306 | name = "rand_core" 1307 | version = "0.6.4" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1310 | dependencies = [ 1311 | "getrandom", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "ratatui" 1316 | version = "0.25.0" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "a5659e52e4ba6e07b2dad9f1158f578ef84a73762625ddb51536019f34d180eb" 1319 | dependencies = [ 1320 | "bitflags 2.4.1", 1321 | "cassowary", 1322 | "crossterm", 1323 | "indoc", 1324 | "itertools", 1325 | "lru", 1326 | "paste", 1327 | "stability", 1328 | "strum", 1329 | "unicode-segmentation", 1330 | "unicode-width", 1331 | ] 1332 | 1333 | [[package]] 1334 | name = "redox_syscall" 1335 | version = "0.4.1" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 1338 | dependencies = [ 1339 | "bitflags 1.3.2", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "regex" 1344 | version = "1.10.3" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" 1347 | dependencies = [ 1348 | "aho-corasick", 1349 | "memchr", 1350 | "regex-automata", 1351 | "regex-syntax", 1352 | ] 1353 | 1354 | [[package]] 1355 | name = "regex-automata" 1356 | version = "0.4.6" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 1359 | dependencies = [ 1360 | "aho-corasick", 1361 | "memchr", 1362 | "regex-syntax", 1363 | ] 1364 | 1365 | [[package]] 1366 | name = "regex-syntax" 1367 | version = "0.8.2" 1368 | source = "registry+https://github.com/rust-lang/crates.io-index" 1369 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 1370 | 1371 | [[package]] 1372 | name = "reqwest" 1373 | version = "0.12.3" 1374 | source = "registry+https://github.com/rust-lang/crates.io-index" 1375 | checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19" 1376 | dependencies = [ 1377 | "base64", 1378 | "bytes", 1379 | "encoding_rs", 1380 | "futures-channel", 1381 | "futures-core", 1382 | "futures-util", 1383 | "h2", 1384 | "http", 1385 | "http-body", 1386 | "http-body-util", 1387 | "hyper", 1388 | "hyper-tls", 1389 | "hyper-util", 1390 | "ipnet", 1391 | "js-sys", 1392 | "log", 1393 | "mime", 1394 | "native-tls", 1395 | "once_cell", 1396 | "percent-encoding", 1397 | "pin-project-lite", 1398 | "rustls-pemfile", 1399 | "serde", 1400 | "serde_json", 1401 | "serde_urlencoded", 1402 | "sync_wrapper", 1403 | "system-configuration", 1404 | "tokio", 1405 | "tokio-native-tls", 1406 | "tokio-util", 1407 | "tower-service", 1408 | "url", 1409 | "wasm-bindgen", 1410 | "wasm-bindgen-futures", 1411 | "wasm-streams", 1412 | "web-sys", 1413 | "winreg", 1414 | ] 1415 | 1416 | [[package]] 1417 | name = "rustc-demangle" 1418 | version = "0.1.23" 1419 | source = "registry+https://github.com/rust-lang/crates.io-index" 1420 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1421 | 1422 | [[package]] 1423 | name = "rustix" 1424 | version = "0.38.28" 1425 | source = "registry+https://github.com/rust-lang/crates.io-index" 1426 | checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" 1427 | dependencies = [ 1428 | "bitflags 2.4.1", 1429 | "errno", 1430 | "libc", 1431 | "linux-raw-sys", 1432 | "windows-sys 0.52.0", 1433 | ] 1434 | 1435 | [[package]] 1436 | name = "rustls-pemfile" 1437 | version = "2.1.2" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" 1440 | dependencies = [ 1441 | "base64", 1442 | "rustls-pki-types", 1443 | ] 1444 | 1445 | [[package]] 1446 | name = "rustls-pki-types" 1447 | version = "1.4.1" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" 1450 | 1451 | [[package]] 1452 | name = "rustversion" 1453 | version = "1.0.14" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" 1456 | 1457 | [[package]] 1458 | name = "ryu" 1459 | version = "1.0.17" 1460 | source = "registry+https://github.com/rust-lang/crates.io-index" 1461 | checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 1462 | 1463 | [[package]] 1464 | name = "schannel" 1465 | version = "0.1.23" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1468 | dependencies = [ 1469 | "windows-sys 0.52.0", 1470 | ] 1471 | 1472 | [[package]] 1473 | name = "scopeguard" 1474 | version = "1.2.0" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1477 | 1478 | [[package]] 1479 | name = "scraper" 1480 | version = "0.19.0" 1481 | source = "registry+https://github.com/rust-lang/crates.io-index" 1482 | checksum = "5b80b33679ff7a0ea53d37f3b39de77ea0c75b12c5805ac43ec0c33b3051af1b" 1483 | dependencies = [ 1484 | "ahash", 1485 | "cssparser", 1486 | "ego-tree", 1487 | "getopts", 1488 | "html5ever", 1489 | "once_cell", 1490 | "selectors", 1491 | "tendril", 1492 | ] 1493 | 1494 | [[package]] 1495 | name = "security-framework" 1496 | version = "2.10.0" 1497 | source = "registry+https://github.com/rust-lang/crates.io-index" 1498 | checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" 1499 | dependencies = [ 1500 | "bitflags 1.3.2", 1501 | "core-foundation", 1502 | "core-foundation-sys", 1503 | "libc", 1504 | "security-framework-sys", 1505 | ] 1506 | 1507 | [[package]] 1508 | name = "security-framework-sys" 1509 | version = "2.10.0" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" 1512 | dependencies = [ 1513 | "core-foundation-sys", 1514 | "libc", 1515 | ] 1516 | 1517 | [[package]] 1518 | name = "selectors" 1519 | version = "0.25.0" 1520 | source = "registry+https://github.com/rust-lang/crates.io-index" 1521 | checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06" 1522 | dependencies = [ 1523 | "bitflags 2.4.1", 1524 | "cssparser", 1525 | "derive_more", 1526 | "fxhash", 1527 | "log", 1528 | "new_debug_unreachable", 1529 | "phf 0.10.1", 1530 | "phf_codegen", 1531 | "precomputed-hash", 1532 | "servo_arc", 1533 | "smallvec", 1534 | ] 1535 | 1536 | [[package]] 1537 | name = "serde" 1538 | version = "1.0.197" 1539 | source = "registry+https://github.com/rust-lang/crates.io-index" 1540 | checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" 1541 | dependencies = [ 1542 | "serde_derive", 1543 | ] 1544 | 1545 | [[package]] 1546 | name = "serde_derive" 1547 | version = "1.0.197" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" 1550 | dependencies = [ 1551 | "proc-macro2", 1552 | "quote", 1553 | "syn 2.0.59", 1554 | ] 1555 | 1556 | [[package]] 1557 | name = "serde_json" 1558 | version = "1.0.116" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" 1561 | dependencies = [ 1562 | "itoa", 1563 | "ryu", 1564 | "serde", 1565 | ] 1566 | 1567 | [[package]] 1568 | name = "serde_urlencoded" 1569 | version = "0.7.1" 1570 | source = "registry+https://github.com/rust-lang/crates.io-index" 1571 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1572 | dependencies = [ 1573 | "form_urlencoded", 1574 | "itoa", 1575 | "ryu", 1576 | "serde", 1577 | ] 1578 | 1579 | [[package]] 1580 | name = "servo_arc" 1581 | version = "0.3.0" 1582 | source = "registry+https://github.com/rust-lang/crates.io-index" 1583 | checksum = "d036d71a959e00c77a63538b90a6c2390969f9772b096ea837205c6bd0491a44" 1584 | dependencies = [ 1585 | "stable_deref_trait", 1586 | ] 1587 | 1588 | [[package]] 1589 | name = "signal-hook" 1590 | version = "0.3.17" 1591 | source = "registry+https://github.com/rust-lang/crates.io-index" 1592 | checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" 1593 | dependencies = [ 1594 | "libc", 1595 | "signal-hook-registry", 1596 | ] 1597 | 1598 | [[package]] 1599 | name = "signal-hook-mio" 1600 | version = "0.2.3" 1601 | source = "registry+https://github.com/rust-lang/crates.io-index" 1602 | checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" 1603 | dependencies = [ 1604 | "libc", 1605 | "mio", 1606 | "signal-hook", 1607 | ] 1608 | 1609 | [[package]] 1610 | name = "signal-hook-registry" 1611 | version = "1.4.1" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 1614 | dependencies = [ 1615 | "libc", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "siphasher" 1620 | version = "0.3.11" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 1623 | 1624 | [[package]] 1625 | name = "slab" 1626 | version = "0.4.9" 1627 | source = "registry+https://github.com/rust-lang/crates.io-index" 1628 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1629 | dependencies = [ 1630 | "autocfg", 1631 | ] 1632 | 1633 | [[package]] 1634 | name = "smallvec" 1635 | version = "1.13.2" 1636 | source = "registry+https://github.com/rust-lang/crates.io-index" 1637 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1638 | 1639 | [[package]] 1640 | name = "socket2" 1641 | version = "0.5.6" 1642 | source = "registry+https://github.com/rust-lang/crates.io-index" 1643 | checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" 1644 | dependencies = [ 1645 | "libc", 1646 | "windows-sys 0.52.0", 1647 | ] 1648 | 1649 | [[package]] 1650 | name = "stability" 1651 | version = "0.1.1" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "ebd1b177894da2a2d9120208c3386066af06a488255caabc5de8ddca22dbc3ce" 1654 | dependencies = [ 1655 | "quote", 1656 | "syn 1.0.109", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "stable_deref_trait" 1661 | version = "1.2.0" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1664 | 1665 | [[package]] 1666 | name = "string_cache" 1667 | version = "0.8.7" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" 1670 | dependencies = [ 1671 | "new_debug_unreachable", 1672 | "once_cell", 1673 | "parking_lot", 1674 | "phf_shared 0.10.0", 1675 | "precomputed-hash", 1676 | "serde", 1677 | ] 1678 | 1679 | [[package]] 1680 | name = "string_cache_codegen" 1681 | version = "0.5.2" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" 1684 | dependencies = [ 1685 | "phf_generator 0.10.0", 1686 | "phf_shared 0.10.0", 1687 | "proc-macro2", 1688 | "quote", 1689 | ] 1690 | 1691 | [[package]] 1692 | name = "strsim" 1693 | version = "0.10.0" 1694 | source = "registry+https://github.com/rust-lang/crates.io-index" 1695 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1696 | 1697 | [[package]] 1698 | name = "strum" 1699 | version = "0.25.0" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" 1702 | dependencies = [ 1703 | "strum_macros", 1704 | ] 1705 | 1706 | [[package]] 1707 | name = "strum_macros" 1708 | version = "0.25.3" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" 1711 | dependencies = [ 1712 | "heck", 1713 | "proc-macro2", 1714 | "quote", 1715 | "rustversion", 1716 | "syn 2.0.59", 1717 | ] 1718 | 1719 | [[package]] 1720 | name = "syn" 1721 | version = "1.0.109" 1722 | source = "registry+https://github.com/rust-lang/crates.io-index" 1723 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1724 | dependencies = [ 1725 | "proc-macro2", 1726 | "quote", 1727 | "unicode-ident", 1728 | ] 1729 | 1730 | [[package]] 1731 | name = "syn" 1732 | version = "2.0.59" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" 1735 | dependencies = [ 1736 | "proc-macro2", 1737 | "quote", 1738 | "unicode-ident", 1739 | ] 1740 | 1741 | [[package]] 1742 | name = "sync_wrapper" 1743 | version = "0.1.2" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1746 | 1747 | [[package]] 1748 | name = "system-configuration" 1749 | version = "0.5.1" 1750 | source = "registry+https://github.com/rust-lang/crates.io-index" 1751 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 1752 | dependencies = [ 1753 | "bitflags 1.3.2", 1754 | "core-foundation", 1755 | "system-configuration-sys", 1756 | ] 1757 | 1758 | [[package]] 1759 | name = "system-configuration-sys" 1760 | version = "0.5.0" 1761 | source = "registry+https://github.com/rust-lang/crates.io-index" 1762 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 1763 | dependencies = [ 1764 | "core-foundation-sys", 1765 | "libc", 1766 | ] 1767 | 1768 | [[package]] 1769 | name = "tempfile" 1770 | version = "3.9.0" 1771 | source = "registry+https://github.com/rust-lang/crates.io-index" 1772 | checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" 1773 | dependencies = [ 1774 | "cfg-if", 1775 | "fastrand", 1776 | "redox_syscall", 1777 | "rustix", 1778 | "windows-sys 0.52.0", 1779 | ] 1780 | 1781 | [[package]] 1782 | name = "tendril" 1783 | version = "0.4.3" 1784 | source = "registry+https://github.com/rust-lang/crates.io-index" 1785 | checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 1786 | dependencies = [ 1787 | "futf", 1788 | "mac", 1789 | "utf-8", 1790 | ] 1791 | 1792 | [[package]] 1793 | name = "tinyvec" 1794 | version = "1.6.0" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1797 | dependencies = [ 1798 | "tinyvec_macros", 1799 | ] 1800 | 1801 | [[package]] 1802 | name = "tinyvec_macros" 1803 | version = "0.1.1" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1806 | 1807 | [[package]] 1808 | name = "tokio" 1809 | version = "1.37.0" 1810 | source = "registry+https://github.com/rust-lang/crates.io-index" 1811 | checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" 1812 | dependencies = [ 1813 | "backtrace", 1814 | "bytes", 1815 | "libc", 1816 | "mio", 1817 | "num_cpus", 1818 | "parking_lot", 1819 | "pin-project-lite", 1820 | "signal-hook-registry", 1821 | "socket2", 1822 | "tokio-macros", 1823 | "windows-sys 0.48.0", 1824 | ] 1825 | 1826 | [[package]] 1827 | name = "tokio-macros" 1828 | version = "2.2.0" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 1831 | dependencies = [ 1832 | "proc-macro2", 1833 | "quote", 1834 | "syn 2.0.59", 1835 | ] 1836 | 1837 | [[package]] 1838 | name = "tokio-native-tls" 1839 | version = "0.3.1" 1840 | source = "registry+https://github.com/rust-lang/crates.io-index" 1841 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1842 | dependencies = [ 1843 | "native-tls", 1844 | "tokio", 1845 | ] 1846 | 1847 | [[package]] 1848 | name = "tokio-stream" 1849 | version = "0.1.15" 1850 | source = "registry+https://github.com/rust-lang/crates.io-index" 1851 | checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" 1852 | dependencies = [ 1853 | "futures-core", 1854 | "pin-project-lite", 1855 | "tokio", 1856 | ] 1857 | 1858 | [[package]] 1859 | name = "tokio-util" 1860 | version = "0.7.10" 1861 | source = "registry+https://github.com/rust-lang/crates.io-index" 1862 | checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 1863 | dependencies = [ 1864 | "bytes", 1865 | "futures-core", 1866 | "futures-sink", 1867 | "pin-project-lite", 1868 | "tokio", 1869 | "tracing", 1870 | ] 1871 | 1872 | [[package]] 1873 | name = "tower" 1874 | version = "0.4.13" 1875 | source = "registry+https://github.com/rust-lang/crates.io-index" 1876 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 1877 | dependencies = [ 1878 | "futures-core", 1879 | "futures-util", 1880 | "pin-project", 1881 | "pin-project-lite", 1882 | "tokio", 1883 | "tower-layer", 1884 | "tower-service", 1885 | "tracing", 1886 | ] 1887 | 1888 | [[package]] 1889 | name = "tower-layer" 1890 | version = "0.3.2" 1891 | source = "registry+https://github.com/rust-lang/crates.io-index" 1892 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 1893 | 1894 | [[package]] 1895 | name = "tower-service" 1896 | version = "0.3.2" 1897 | source = "registry+https://github.com/rust-lang/crates.io-index" 1898 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1899 | 1900 | [[package]] 1901 | name = "tracing" 1902 | version = "0.1.40" 1903 | source = "registry+https://github.com/rust-lang/crates.io-index" 1904 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1905 | dependencies = [ 1906 | "log", 1907 | "pin-project-lite", 1908 | "tracing-core", 1909 | ] 1910 | 1911 | [[package]] 1912 | name = "tracing-core" 1913 | version = "0.1.32" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1916 | dependencies = [ 1917 | "once_cell", 1918 | ] 1919 | 1920 | [[package]] 1921 | name = "try-lock" 1922 | version = "0.2.5" 1923 | source = "registry+https://github.com/rust-lang/crates.io-index" 1924 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1925 | 1926 | [[package]] 1927 | name = "unicode-bidi" 1928 | version = "0.3.15" 1929 | source = "registry+https://github.com/rust-lang/crates.io-index" 1930 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 1931 | 1932 | [[package]] 1933 | name = "unicode-ident" 1934 | version = "1.0.12" 1935 | source = "registry+https://github.com/rust-lang/crates.io-index" 1936 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1937 | 1938 | [[package]] 1939 | name = "unicode-normalization" 1940 | version = "0.1.23" 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" 1942 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 1943 | dependencies = [ 1944 | "tinyvec", 1945 | ] 1946 | 1947 | [[package]] 1948 | name = "unicode-segmentation" 1949 | version = "1.10.1" 1950 | source = "registry+https://github.com/rust-lang/crates.io-index" 1951 | checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" 1952 | 1953 | [[package]] 1954 | name = "unicode-width" 1955 | version = "0.1.11" 1956 | source = "registry+https://github.com/rust-lang/crates.io-index" 1957 | checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" 1958 | 1959 | [[package]] 1960 | name = "url" 1961 | version = "2.5.0" 1962 | source = "registry+https://github.com/rust-lang/crates.io-index" 1963 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 1964 | dependencies = [ 1965 | "form_urlencoded", 1966 | "idna", 1967 | "percent-encoding", 1968 | ] 1969 | 1970 | [[package]] 1971 | name = "utf-8" 1972 | version = "0.7.6" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 1975 | 1976 | [[package]] 1977 | name = "utf8parse" 1978 | version = "0.2.1" 1979 | source = "registry+https://github.com/rust-lang/crates.io-index" 1980 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 1981 | 1982 | [[package]] 1983 | name = "uuid" 1984 | version = "0.8.2" 1985 | source = "registry+https://github.com/rust-lang/crates.io-index" 1986 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 1987 | dependencies = [ 1988 | "getrandom", 1989 | ] 1990 | 1991 | [[package]] 1992 | name = "uuid" 1993 | version = "1.8.0" 1994 | source = "registry+https://github.com/rust-lang/crates.io-index" 1995 | checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" 1996 | dependencies = [ 1997 | "getrandom", 1998 | "wasm-bindgen", 1999 | ] 2000 | 2001 | [[package]] 2002 | name = "vayu" 2003 | version = "0.2.3" 2004 | dependencies = [ 2005 | "chrono", 2006 | "clap", 2007 | "colored", 2008 | "crossterm", 2009 | "date_time_parser", 2010 | "event_parser", 2011 | "icalendar 0.16.0", 2012 | "indicatif", 2013 | "ollama-rs", 2014 | "rand", 2015 | "ratatui", 2016 | "reqwest", 2017 | "scraper", 2018 | "serde", 2019 | "serde_json", 2020 | "tokio", 2021 | "tokio-stream", 2022 | ] 2023 | 2024 | [[package]] 2025 | name = "vcpkg" 2026 | version = "0.2.15" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2029 | 2030 | [[package]] 2031 | name = "version_check" 2032 | version = "0.9.4" 2033 | source = "registry+https://github.com/rust-lang/crates.io-index" 2034 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2035 | 2036 | [[package]] 2037 | name = "want" 2038 | version = "0.3.1" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2041 | dependencies = [ 2042 | "try-lock", 2043 | ] 2044 | 2045 | [[package]] 2046 | name = "wasi" 2047 | version = "0.11.0+wasi-snapshot-preview1" 2048 | source = "registry+https://github.com/rust-lang/crates.io-index" 2049 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2050 | 2051 | [[package]] 2052 | name = "wasm-bindgen" 2053 | version = "0.2.89" 2054 | source = "registry+https://github.com/rust-lang/crates.io-index" 2055 | checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" 2056 | dependencies = [ 2057 | "cfg-if", 2058 | "wasm-bindgen-macro", 2059 | ] 2060 | 2061 | [[package]] 2062 | name = "wasm-bindgen-backend" 2063 | version = "0.2.89" 2064 | source = "registry+https://github.com/rust-lang/crates.io-index" 2065 | checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" 2066 | dependencies = [ 2067 | "bumpalo", 2068 | "log", 2069 | "once_cell", 2070 | "proc-macro2", 2071 | "quote", 2072 | "syn 2.0.59", 2073 | "wasm-bindgen-shared", 2074 | ] 2075 | 2076 | [[package]] 2077 | name = "wasm-bindgen-futures" 2078 | version = "0.4.39" 2079 | source = "registry+https://github.com/rust-lang/crates.io-index" 2080 | checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" 2081 | dependencies = [ 2082 | "cfg-if", 2083 | "js-sys", 2084 | "wasm-bindgen", 2085 | "web-sys", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "wasm-bindgen-macro" 2090 | version = "0.2.89" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" 2093 | dependencies = [ 2094 | "quote", 2095 | "wasm-bindgen-macro-support", 2096 | ] 2097 | 2098 | [[package]] 2099 | name = "wasm-bindgen-macro-support" 2100 | version = "0.2.89" 2101 | source = "registry+https://github.com/rust-lang/crates.io-index" 2102 | checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" 2103 | dependencies = [ 2104 | "proc-macro2", 2105 | "quote", 2106 | "syn 2.0.59", 2107 | "wasm-bindgen-backend", 2108 | "wasm-bindgen-shared", 2109 | ] 2110 | 2111 | [[package]] 2112 | name = "wasm-bindgen-shared" 2113 | version = "0.2.89" 2114 | source = "registry+https://github.com/rust-lang/crates.io-index" 2115 | checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" 2116 | 2117 | [[package]] 2118 | name = "wasm-streams" 2119 | version = "0.4.0" 2120 | source = "registry+https://github.com/rust-lang/crates.io-index" 2121 | checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" 2122 | dependencies = [ 2123 | "futures-util", 2124 | "js-sys", 2125 | "wasm-bindgen", 2126 | "wasm-bindgen-futures", 2127 | "web-sys", 2128 | ] 2129 | 2130 | [[package]] 2131 | name = "web-sys" 2132 | version = "0.3.66" 2133 | source = "registry+https://github.com/rust-lang/crates.io-index" 2134 | checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" 2135 | dependencies = [ 2136 | "js-sys", 2137 | "wasm-bindgen", 2138 | ] 2139 | 2140 | [[package]] 2141 | name = "winapi" 2142 | version = "0.3.9" 2143 | source = "registry+https://github.com/rust-lang/crates.io-index" 2144 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2145 | dependencies = [ 2146 | "winapi-i686-pc-windows-gnu", 2147 | "winapi-x86_64-pc-windows-gnu", 2148 | ] 2149 | 2150 | [[package]] 2151 | name = "winapi-i686-pc-windows-gnu" 2152 | version = "0.4.0" 2153 | source = "registry+https://github.com/rust-lang/crates.io-index" 2154 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2155 | 2156 | [[package]] 2157 | name = "winapi-x86_64-pc-windows-gnu" 2158 | version = "0.4.0" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2161 | 2162 | [[package]] 2163 | name = "windows-core" 2164 | version = "0.52.0" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2167 | dependencies = [ 2168 | "windows-targets 0.52.0", 2169 | ] 2170 | 2171 | [[package]] 2172 | name = "windows-sys" 2173 | version = "0.45.0" 2174 | source = "registry+https://github.com/rust-lang/crates.io-index" 2175 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 2176 | dependencies = [ 2177 | "windows-targets 0.42.2", 2178 | ] 2179 | 2180 | [[package]] 2181 | name = "windows-sys" 2182 | version = "0.48.0" 2183 | source = "registry+https://github.com/rust-lang/crates.io-index" 2184 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2185 | dependencies = [ 2186 | "windows-targets 0.48.5", 2187 | ] 2188 | 2189 | [[package]] 2190 | name = "windows-sys" 2191 | version = "0.52.0" 2192 | source = "registry+https://github.com/rust-lang/crates.io-index" 2193 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2194 | dependencies = [ 2195 | "windows-targets 0.52.0", 2196 | ] 2197 | 2198 | [[package]] 2199 | name = "windows-targets" 2200 | version = "0.42.2" 2201 | source = "registry+https://github.com/rust-lang/crates.io-index" 2202 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 2203 | dependencies = [ 2204 | "windows_aarch64_gnullvm 0.42.2", 2205 | "windows_aarch64_msvc 0.42.2", 2206 | "windows_i686_gnu 0.42.2", 2207 | "windows_i686_msvc 0.42.2", 2208 | "windows_x86_64_gnu 0.42.2", 2209 | "windows_x86_64_gnullvm 0.42.2", 2210 | "windows_x86_64_msvc 0.42.2", 2211 | ] 2212 | 2213 | [[package]] 2214 | name = "windows-targets" 2215 | version = "0.48.5" 2216 | source = "registry+https://github.com/rust-lang/crates.io-index" 2217 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2218 | dependencies = [ 2219 | "windows_aarch64_gnullvm 0.48.5", 2220 | "windows_aarch64_msvc 0.48.5", 2221 | "windows_i686_gnu 0.48.5", 2222 | "windows_i686_msvc 0.48.5", 2223 | "windows_x86_64_gnu 0.48.5", 2224 | "windows_x86_64_gnullvm 0.48.5", 2225 | "windows_x86_64_msvc 0.48.5", 2226 | ] 2227 | 2228 | [[package]] 2229 | name = "windows-targets" 2230 | version = "0.52.0" 2231 | source = "registry+https://github.com/rust-lang/crates.io-index" 2232 | checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" 2233 | dependencies = [ 2234 | "windows_aarch64_gnullvm 0.52.0", 2235 | "windows_aarch64_msvc 0.52.0", 2236 | "windows_i686_gnu 0.52.0", 2237 | "windows_i686_msvc 0.52.0", 2238 | "windows_x86_64_gnu 0.52.0", 2239 | "windows_x86_64_gnullvm 0.52.0", 2240 | "windows_x86_64_msvc 0.52.0", 2241 | ] 2242 | 2243 | [[package]] 2244 | name = "windows_aarch64_gnullvm" 2245 | version = "0.42.2" 2246 | source = "registry+https://github.com/rust-lang/crates.io-index" 2247 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 2248 | 2249 | [[package]] 2250 | name = "windows_aarch64_gnullvm" 2251 | version = "0.48.5" 2252 | source = "registry+https://github.com/rust-lang/crates.io-index" 2253 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2254 | 2255 | [[package]] 2256 | name = "windows_aarch64_gnullvm" 2257 | version = "0.52.0" 2258 | source = "registry+https://github.com/rust-lang/crates.io-index" 2259 | checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" 2260 | 2261 | [[package]] 2262 | name = "windows_aarch64_msvc" 2263 | version = "0.42.2" 2264 | source = "registry+https://github.com/rust-lang/crates.io-index" 2265 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 2266 | 2267 | [[package]] 2268 | name = "windows_aarch64_msvc" 2269 | version = "0.48.5" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2272 | 2273 | [[package]] 2274 | name = "windows_aarch64_msvc" 2275 | version = "0.52.0" 2276 | source = "registry+https://github.com/rust-lang/crates.io-index" 2277 | checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" 2278 | 2279 | [[package]] 2280 | name = "windows_i686_gnu" 2281 | version = "0.42.2" 2282 | source = "registry+https://github.com/rust-lang/crates.io-index" 2283 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 2284 | 2285 | [[package]] 2286 | name = "windows_i686_gnu" 2287 | version = "0.48.5" 2288 | source = "registry+https://github.com/rust-lang/crates.io-index" 2289 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2290 | 2291 | [[package]] 2292 | name = "windows_i686_gnu" 2293 | version = "0.52.0" 2294 | source = "registry+https://github.com/rust-lang/crates.io-index" 2295 | checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" 2296 | 2297 | [[package]] 2298 | name = "windows_i686_msvc" 2299 | version = "0.42.2" 2300 | source = "registry+https://github.com/rust-lang/crates.io-index" 2301 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 2302 | 2303 | [[package]] 2304 | name = "windows_i686_msvc" 2305 | version = "0.48.5" 2306 | source = "registry+https://github.com/rust-lang/crates.io-index" 2307 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2308 | 2309 | [[package]] 2310 | name = "windows_i686_msvc" 2311 | version = "0.52.0" 2312 | source = "registry+https://github.com/rust-lang/crates.io-index" 2313 | checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" 2314 | 2315 | [[package]] 2316 | name = "windows_x86_64_gnu" 2317 | version = "0.42.2" 2318 | source = "registry+https://github.com/rust-lang/crates.io-index" 2319 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 2320 | 2321 | [[package]] 2322 | name = "windows_x86_64_gnu" 2323 | version = "0.48.5" 2324 | source = "registry+https://github.com/rust-lang/crates.io-index" 2325 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2326 | 2327 | [[package]] 2328 | name = "windows_x86_64_gnu" 2329 | version = "0.52.0" 2330 | source = "registry+https://github.com/rust-lang/crates.io-index" 2331 | checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" 2332 | 2333 | [[package]] 2334 | name = "windows_x86_64_gnullvm" 2335 | version = "0.42.2" 2336 | source = "registry+https://github.com/rust-lang/crates.io-index" 2337 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 2338 | 2339 | [[package]] 2340 | name = "windows_x86_64_gnullvm" 2341 | version = "0.48.5" 2342 | source = "registry+https://github.com/rust-lang/crates.io-index" 2343 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2344 | 2345 | [[package]] 2346 | name = "windows_x86_64_gnullvm" 2347 | version = "0.52.0" 2348 | source = "registry+https://github.com/rust-lang/crates.io-index" 2349 | checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" 2350 | 2351 | [[package]] 2352 | name = "windows_x86_64_msvc" 2353 | version = "0.42.2" 2354 | source = "registry+https://github.com/rust-lang/crates.io-index" 2355 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 2356 | 2357 | [[package]] 2358 | name = "windows_x86_64_msvc" 2359 | version = "0.48.5" 2360 | source = "registry+https://github.com/rust-lang/crates.io-index" 2361 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2362 | 2363 | [[package]] 2364 | name = "windows_x86_64_msvc" 2365 | version = "0.52.0" 2366 | source = "registry+https://github.com/rust-lang/crates.io-index" 2367 | checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" 2368 | 2369 | [[package]] 2370 | name = "winreg" 2371 | version = "0.52.0" 2372 | source = "registry+https://github.com/rust-lang/crates.io-index" 2373 | checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" 2374 | dependencies = [ 2375 | "cfg-if", 2376 | "windows-sys 0.48.0", 2377 | ] 2378 | 2379 | [[package]] 2380 | name = "zerocopy" 2381 | version = "0.7.32" 2382 | source = "registry+https://github.com/rust-lang/crates.io-index" 2383 | checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" 2384 | dependencies = [ 2385 | "zerocopy-derive", 2386 | ] 2387 | 2388 | [[package]] 2389 | name = "zerocopy-derive" 2390 | version = "0.7.32" 2391 | source = "registry+https://github.com/rust-lang/crates.io-index" 2392 | checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" 2393 | dependencies = [ 2394 | "proc-macro2", 2395 | "quote", 2396 | "syn 2.0.59", 2397 | ] 2398 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "vayu" 3 | version = "0.2.4" 4 | edition = "2021" 5 | authors = ["Raghav Tirumale raghav.tirumale@gmail.com"] 6 | license = "MIT" 7 | readme = "README.md" 8 | homepage = "https://github.com/MythicalCow/vayu" 9 | repository = "https://github.com/MythicalCow/vayu" 10 | keywords = ["cli"] 11 | categories = ["command-line-utilities"] 12 | description = "a minimalist CLI task-management tool that includes task scheduling, pomodoro, news fetching, and an LLM interface" 13 | 14 | 15 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 16 | 17 | [dependencies] 18 | serde = { version = "1.0.190", features = ["derive"] } 19 | serde_json = "1.0.116" 20 | tokio = { version = "1", features = ["full"]} 21 | tokio-stream = { version = "0.1.15"} 22 | ollama-rs = { version = "0.1.9", features = ["stream", "chat-history"] } 23 | chrono = "0.4.31" 24 | clap = { version = "4.4.12", features = ["derive"] } 25 | colored = "2.1.0" 26 | crossterm = "0.27.0" 27 | event_parser = "0.1.1" 28 | icalendar = "0.16.0" 29 | indicatif = "0.17.7" 30 | date_time_parser = "0.1.0" 31 | rand = "0.8.5" 32 | ratatui = "0.25.0" 33 | scraper = "0.19.0" 34 | reqwest = { version = "0.12.1", features = ["blocking"] } 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![banner](banner.png) 2 | [![Crate](https://img.shields.io/crates/v/vayu.svg)](https://crates.io/crates/vayu) 3 | 4 | # Description 5 | Vayu is a productivity supercharger for engineers. The end goal for the tool is to have a multipurpose tool with various tools such as task and note storage, task management, and a pomodoro study timer. As a computer engineering student at UIUC, having an organized optimized system is critical. I hope to bring that to others with vayu. 6 | # Demo Images 7 | ![demo](demo.png) 8 | ![demo2](demo2.png) 9 | # Installation 10 | The best way to install vayu is via cargo which comes with an installation of rust. For installation of rust navigate to https://www.rust-lang.org/tools/install. 11 | 12 | Then in Windows PowerShell or the approriate Terminal for your OS type in: 13 | `cargo install vayu` 14 | 15 | Additionally Ollama must be installed for LLM based commands at https://ollama.com/. 16 | 17 | Then in terminal type in: 18 | `ollama run gemma2:2b` 19 | 20 | You can then exit the terminal once the model has been intalled. 21 | 22 | To check if vayu has been installed properly open a new terminal window and type: 23 | `vayu list` 24 | 25 | If there is an empty list then congratulations the installation was successful! If not ensure rust is included in your path variable as explained on the rust installation page. 26 | # Usage and Examples 27 | 28 | ### to view a list of current tasks use: 29 | `vayu list` 30 | 31 | ### to add a task with natural language: 32 | `vayu auto "task description (some description of date)"` 33 | 34 | ### to ask general or task specific questions to the integrated LLM 35 | `vayu ask "question string"` 36 | 37 | ### to mark tasks as done: 38 | `vayu done id` 39 | where id is the listed id of the task viewable through `vayu list` 40 | 41 | ### to use the pomodoro timer: 42 | `vayu pomo iterations work_session_time break_session_time` 43 | 44 | ### grab the latest in tech from y-combinator's hacker news 45 | `vayu news` 46 | 47 | ### add an event 48 | `vayu eadd "ece110 lab" 12:00pm 2:50pm 2024-04-25` 49 | 50 | ### view event ids 51 | `vayu elist` 52 | 53 | ### remove event by id 54 | `vayu erem id` 55 | 56 | # Deprecated Features 57 | The following tools have better alternatives on the market currently and have hence are in a legacy state. 58 | * Event Planner 59 | * Main Dashboard 60 | 61 | # Contributions 62 | vayu wouldn't be possible without several great rust crates. For a full list of dependencies please checkout the `Cargo.toml` file. 63 | -------------------------------------------------------------------------------- /banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MythicalCow/vayu/7d8eadea134fd362bfa80078c62b80270526e929/banner.png -------------------------------------------------------------------------------- /demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MythicalCow/vayu/7d8eadea134fd362bfa80078c62b80270526e929/demo.png -------------------------------------------------------------------------------- /demo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MythicalCow/vayu/7d8eadea134fd362bfa80078c62b80270526e929/demo2.png -------------------------------------------------------------------------------- /events.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MythicalCow/vayu/7d8eadea134fd362bfa80078c62b80270526e929/events.txt -------------------------------------------------------------------------------- /future.txt: -------------------------------------------------------------------------------- 1 | short term goals 2 | - DONE - agenda and event system 3 | - add command support within ui 4 | - implement pdf and txt summarization system 5 | 6 | medium term goals 7 | - DONE - better ui 8 | - add music to pomodoro system 9 | 10 | long term goals 11 | - DONE - natural language processing for task scheduling 12 | - DONE - adding llm support 13 | -------------------------------------------------------------------------------- /src/events.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MythicalCow/vayu/7d8eadea134fd362bfa80078c62b80270526e929/src/events.txt -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | extern crate clap; 2 | extern crate colored; 3 | extern crate chrono; 4 | extern crate indicatif; 5 | extern crate date_time_parser; 6 | 7 | //date parsers. 8 | use date_time_parser::DateParser; 9 | 10 | //tui 11 | use std::io::{self, stdout, BufRead, Write}; 12 | use crossterm::{ 13 | event::{self, Event as UIEvent, KeyCode}, style::Stylize, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, ExecutableCommand 14 | }; 15 | use ratatui::{prelude::*, widgets::*}; 16 | use clap::Parser; 17 | use std::fs::File; 18 | use std::path::Path; 19 | use chrono::{Local,Duration}; 20 | //use std::io::prelude::*; 21 | //use chrono::Datelike; 22 | use indicatif::ProgressBar; 23 | 24 | 25 | //llm 26 | use ollama_rs::{ 27 | generation::completion::{ 28 | request::GenerationRequest, GenerationContext, GenerationResponseStream, 29 | }, 30 | Ollama, 31 | }; 32 | use tokio_stream::StreamExt; 33 | use tokio::io::{stdout as tokiostdout, AsyncWriteExt}; 34 | 35 | //summarizer dependencies 36 | use std::fs as fs; 37 | 38 | 39 | 40 | //rewrite for CLI parser using subcommand feature 41 | //add, list, done, pomo, eadd, elist, eids, erem 42 | #[derive(Parser)] 43 | enum SubComm { 44 | News{ 45 | }, 46 | Add{ 47 | /// task description and due date (YYYY-MM-DD or today,yesterday,monday,etc.) separated by a colon. Ex: "vayu add yoga due:today" 48 | arg1: String, 49 | }, 50 | Ask{ 51 | /// question to ask to phi llm. Ex: vayu ask "what is the goal of rust" 52 | arg1: String, 53 | }, 54 | Summary{ 55 | /// text to summarize. Ex: vayu summarize "path/to/file.txt" or "path/to/file.pdf" 56 | arg1: String, 57 | }, 58 | Auto{ 59 | /// auto generate a task. Ex: vayu auto "test at end of month" 60 | arg1: String, 61 | }, 62 | List{ 63 | }, 64 | Done{ 65 | /// task id. Ex: "vayu done 1" 66 | arg1: String, 67 | }, 68 | Pomo{ 69 | /// number of work sessions 70 | arg1: String, 71 | /// length of work session in minutes 72 | arg2: String, 73 | /// length of break session in minutes 74 | arg3: String, 75 | }, 76 | Eadd{ 77 | /// event description 78 | arg1: String, 79 | /// event start time (H:MMam or H:MMpm) 80 | arg2: String, 81 | /// event end time (H:MMam or H:MMpm) 82 | arg3: String, 83 | /// event repeat (day1,day2,day3,day4,day5,day6,day7 where dayi is a day of the week) or (YYYY-MM-DD) or (everyday,weekday,weekend) 84 | arg4: String, 85 | }, 86 | Elist{ 87 | }, 88 | Eids{ 89 | }, 90 | Erem{ 91 | /// event id to remove 92 | arg1: String, 93 | }, 94 | } 95 | 96 | //struct for the main command. 97 | #[derive(Parser)] 98 | struct Arguments { 99 | #[clap(default_value = "")] 100 | command: String, 101 | #[clap(default_value = "")] 102 | arg1: String, 103 | #[clap(default_value = "")] 104 | arg2: String, 105 | #[clap(default_value = "")] 106 | arg3: String, 107 | #[clap(default_value = "")] 108 | arg4: String, 109 | } 110 | 111 | //struct for a task. there are some weird warnings about this being unused 112 | #[allow(dead_code)] 113 | #[derive(Clone)] 114 | struct Task { 115 | description: String, 116 | due: String, 117 | done: bool, 118 | id: i32, 119 | } 120 | 121 | #[allow(dead_code)] 122 | #[derive(Clone)] 123 | struct Event1 { 124 | description: String, 125 | start: String, 126 | end: String, 127 | repeat: String, 128 | id: i32, 129 | } 130 | 131 | 132 | 133 | 134 | #[tokio::main] 135 | async fn main() -> Result<(), Box> { 136 | let ollama = Ollama::default(); 137 | 138 | let mut tkstdout = tokiostdout(); 139 | 140 | let mut _context: Option = None; 141 | 142 | let mut next_id = 0; 143 | 144 | let file = File::open("tasks.txt"); 145 | //if the file doesn't exist, create it 146 | if file.is_err() { 147 | File::create("tasks.txt").expect("Unable to create file"); 148 | } 149 | 150 | let file2 = File::open("events.txt"); 151 | //if the file doesn't exist, create it 152 | if file2.is_err() { 153 | File::create("events.txt").expect("Unable to create file"); 154 | } 155 | 156 | 157 | //reads the task list data into a vector of tasks. (this is used by task list and for updating the file after adding a task) 158 | let mut tasks : Vec = Vec::new(); 159 | if let Ok(lines) = read_lines("tasks.txt") { 160 | // Consumes the iterator, returns an (Optional) String 161 | for line in lines { 162 | if let Ok(task) = line { 163 | let task_vec : Vec<&str> = task.split("%").collect(); 164 | let task_id = task_vec[3].to_string().parse::().unwrap(); 165 | let task = Task { 166 | description: task_vec[0].to_string(), 167 | due: task_vec[1].to_string(), 168 | done: task_vec[2].to_string().parse::().unwrap(), 169 | id: task_id, 170 | }; 171 | if task_id > next_id { 172 | next_id = task_id; 173 | } 174 | tasks.push(task); 175 | } 176 | } 177 | } 178 | //next id to be used is one higher than the highest id in the task list 179 | next_id += 1; 180 | 181 | let mut next_event_id = 0; 182 | 183 | //reads the event list data into a vector of events. (this is used by event list and for updating the file after adding an event) 184 | let mut events : Vec = Vec::new(); 185 | if let Ok(lines) = read_lines("events.txt") { 186 | // Consumes the iterator, returns an (Optional) String 187 | for line in lines { 188 | if let Ok(event) = line { 189 | let event_vec : Vec<&str> = event.split("%").collect(); 190 | let event_id = event_vec[4].to_string().parse::().unwrap(); 191 | let event = Event1 { 192 | description: event_vec[0].to_string(), 193 | start: event_vec[1].to_string(), 194 | end: event_vec[2].to_string(), 195 | repeat: event_vec[3].to_string(), 196 | id: event_id, 197 | }; 198 | if event_id > next_event_id { 199 | next_event_id = event_id; 200 | } 201 | events.push(event); 202 | } 203 | } 204 | } 205 | 206 | //next id to be used is one higher than the highest id in the event list 207 | next_event_id += 1; 208 | 209 | 210 | 211 | //CLI PARSING 212 | let matches = Arguments::parse(); 213 | match matches.command.as_str() { 214 | //use the subcommands so that --help works for each subcommand 215 | //we want to see the internal comments for each subcommand so we can't use the macro 216 | "add" => { 217 | let submatches = SubComm::parse(); 218 | match submatches { 219 | SubComm::Add{arg1} => { 220 | add_task(&mut tasks, next_id, arg1); 221 | }, 222 | _ => { 223 | println!("invalid usage of add. use --help to see usage"); 224 | } 225 | } 226 | }, 227 | "summary" =>{ 228 | let submatches = SubComm::parse(); 229 | match submatches { 230 | SubComm::Summary{arg1} => { 231 | if !arg1.ends_with(".txt"){ 232 | println!("invalid file type. use .txt or .pdf files"); 233 | } 234 | else{ 235 | //read the file 236 | let contents = fs::read_to_string(arg1).expect("error reading file"); 237 | //pass to the ollama llm as input and ask to summarize 238 | let prompt = format!("summarize the following text in less than three sentences: {} don't provide any hypthetical scenarios afterwards.", contents); 239 | println!("Summarizer Initialized...."); 240 | let ollama = Ollama::default(); 241 | 242 | let mut tkstdout = tokiostdout(); 243 | 244 | let mut _context: Option = None; 245 | 246 | let mut request = GenerationRequest::new("gemma2:2b".into(), prompt); 247 | if let Some(context) = _context.clone() { 248 | request = request.context(context); 249 | } 250 | println!("Generating Summary..."); 251 | let mut stream: GenerationResponseStream = ollama.generate_stream(request).await?; 252 | 253 | while let Some(Ok(res)) = stream.next().await { 254 | for ele in res { 255 | tkstdout.write_all(ele.response.as_bytes()).await?; 256 | tkstdout.flush().await?; 257 | 258 | if let Some(final_data) = ele.final_data { 259 | _context = Some(final_data.context); 260 | } 261 | } 262 | } 263 | 264 | } 265 | }, 266 | _ => { 267 | println!("invalid usage of summary. use --help to see usage"); 268 | } 269 | } 270 | } 271 | "ask" => { 272 | let submatches = SubComm::parse(); 273 | match submatches { 274 | SubComm::Ask{arg1} => { 275 | let input = arg1.to_string(); 276 | let input = input.trim_end(); 277 | let sys_prompt = "If the user asks about anything task related use the following list of tasks as context: "; 278 | //combine all tasks into a context string 279 | let mut context = "".to_string(); 280 | for task in &tasks { 281 | context.push_str(&task.description); 282 | context.push_str(", Deadline: "); 283 | context.push_str(&task.due); 284 | } 285 | //add system_prompt and context to input. which is of type &str 286 | let input = format!("{} {} {}. Now respond to this question briefly: ", sys_prompt, context, input); 287 | 288 | if input.eq_ignore_ascii_case("exit") { 289 | return Ok(()) 290 | } 291 | 292 | let mut request = GenerationRequest::new("gemma2:2b".into(), input.to_string()); 293 | if let Some(context) = _context.clone() { 294 | request = request.context(context); 295 | } 296 | let mut stream: GenerationResponseStream = ollama.generate_stream(request).await?; 297 | 298 | while let Some(Ok(res)) = stream.next().await { 299 | for ele in res { 300 | tkstdout.write_all(ele.response.as_bytes()).await?; 301 | tkstdout.flush().await?; 302 | 303 | if let Some(final_data) = ele.final_data { 304 | _context = Some(final_data.context); 305 | } 306 | } 307 | } 308 | 309 | 310 | }, 311 | _ => { 312 | println!("invalid usage of ask. use --help to see usage"); 313 | } 314 | } 315 | }, 316 | "auto" => { 317 | let submatches = SubComm::parse(); 318 | match submatches { 319 | SubComm::Auto{arg1} => { 320 | add_auto(&mut tasks, next_id, arg1); 321 | }, 322 | _ => { 323 | println!("invalid usage of auto. use --help to see usage"); 324 | } 325 | } 326 | } 327 | "news" => { 328 | let submatches = SubComm::parse(); 329 | match submatches { 330 | SubComm::News{} => { 331 | news(); 332 | }, 333 | _ => { 334 | println!("invalid usage of news. use --help to see usage"); 335 | } 336 | } 337 | }, 338 | "list" => { 339 | let submatches = SubComm::parse(); 340 | match submatches { 341 | SubComm::List{} => { 342 | list_tasks(&mut tasks); 343 | }, 344 | _ => { 345 | println!("invalid usage of list. use --help to see usage"); 346 | } 347 | } 348 | }, 349 | "done" => { 350 | let submatches = SubComm::parse(); 351 | match submatches { 352 | SubComm::Done{arg1} => { 353 | remove_task(&mut tasks, arg1); 354 | }, 355 | _ => { 356 | println!("invalid usage of done. use --help to see usage"); 357 | } 358 | } 359 | }, 360 | "pomo" => { 361 | let submatches = SubComm::parse(); 362 | match submatches { 363 | SubComm::Pomo{arg1, arg2, arg3} => { 364 | pomodoro(arg1, arg2, arg3); 365 | }, 366 | _ => { 367 | println!("invalid usage of pomo. use --help to see usage"); 368 | } 369 | } 370 | }, 371 | "eadd" => { 372 | let submatches = SubComm::parse(); 373 | match submatches { 374 | SubComm::Eadd{arg1, arg2, arg3, arg4} => { 375 | add_event(&mut events, arg1, arg2, arg3, arg4, next_event_id); 376 | }, 377 | _ => { 378 | println!("invalid usage of eadd. use --help to see usage"); 379 | } 380 | } 381 | }, 382 | "elist" => { 383 | let submatches = SubComm::parse(); 384 | match submatches { 385 | SubComm::Elist{} => { 386 | daily_agenda(&mut events); 387 | }, 388 | _ => { 389 | println!("invalid usage of elist. use --help to see usage"); 390 | } 391 | } 392 | }, 393 | "eids" => { 394 | let submatches = SubComm::parse(); 395 | match submatches { 396 | SubComm::Eids{} => { 397 | list_event_ids(&mut events); 398 | }, 399 | _ => { 400 | println!("invalid usage of eids. use --help to see usage"); 401 | } 402 | } 403 | }, 404 | "erem" => { 405 | let submatches = SubComm::parse(); 406 | match submatches { 407 | SubComm::Erem{arg1} => { 408 | remove_event(&mut events, arg1); 409 | }, 410 | _ => { 411 | println!("invalid usage of erem. use --help to see usage"); 412 | } 413 | } 414 | }, 415 | "" => { 416 | //if no command is given, run the vayu ui 417 | vayu_ui(&mut tasks, &mut events).expect("error"); 418 | }, 419 | _ => { 420 | println!("invalid command. use --help to see usage"); 421 | } 422 | 423 | 424 | 425 | } 426 | //write the task list to the file 427 | let mut file = File::create("tasks.txt").expect("Unable to create file"); 428 | for task in &tasks { 429 | let task_str = format!("{}%{}%{}%{}\n", task.description, task.due, task.done, task.id); 430 | file.write_all(task_str.as_bytes()).expect("Unable to write data"); 431 | } 432 | 433 | //write the event list to the file 434 | let mut file = File::create("events.txt").expect("Unable to create file"); 435 | for event in events { 436 | let event_str = format!("{}%{}%{}%{}%{}\n", event.description, event.start, event.end, event.repeat, event.id); 437 | file.write_all(event_str.as_bytes()).expect("Unable to write data"); 438 | } 439 | 440 | Ok(()) 441 | } 442 | 443 | 444 | fn list_tasks(tasks: &mut Vec) { 445 | //sort the tasks by due date and store in dtasks 446 | let dtasks = tasks; 447 | dtasks.sort_by(|t1, t2| t1.due.cmp(&t2.due)); 448 | //display the tasks 449 | println!("ID | Due Date | Task Description"); 450 | println!("----|------------|-----------------"); 451 | let mut i = 0; 452 | for task in dtasks { 453 | if !task.done { 454 | //make task id a len 3 string pad with spaces 455 | let mut id = task.id.to_string(); 456 | while id.len() < 4 { 457 | id.push(' '); 458 | } 459 | //if due date is today use red text 460 | if task.due == Local::now().format("%Y-%m-%d").to_string() { 461 | println!("{}| {} | {}", id.green(), task.due.clone().red(), task.description.clone().red()); 462 | } 463 | else if i % 2 == 0 { 464 | println!("{}| {} | {}", id.green(), task.due, task.description); 465 | } 466 | else { 467 | println!("{}| {} | {}", id.green(), task.due, task.description); 468 | } 469 | i += 1; 470 | } 471 | } 472 | 473 | } 474 | 475 | fn add_task(tasks: &mut Vec, next_id: i32, arg1: String) { 476 | //parse the task description and due date from the arg1 string 477 | let arg1_vec : Vec<&str> = arg1.split(":").collect(); 478 | if arg1_vec.len() != 2 { 479 | println!("invalid usage of add. use --help to see usage"); 480 | return; 481 | } 482 | let mut task_desc = arg1_vec[0].to_string(); 483 | task_desc.truncate(task_desc.len() - 3); 484 | let mut due_date = arg1_vec[1].to_string(); 485 | //remove \n from the end of due_date 486 | due_date = due_date.replace("\n", ""); 487 | println!("due date: {}", due_date); 488 | //if the due date is "today" or "tomorrow" or "yesterday" or a day of the week, set the due date to the appropriate date 489 | //we use DateTime to get the current date and time 490 | let now = Local::now(); 491 | //calculate number of days from 492 | if due_date == "today" { 493 | due_date = now.format("%Y-%m-%d").to_string(); 494 | } 495 | else if due_date == "tomorrow" { 496 | due_date = (now + Duration::days(1)).format("%Y-%m-%d").to_string(); 497 | } 498 | else if due_date == "yesterday" { 499 | due_date = (now - Duration::days(1)).format("%Y-%m-%d").to_string(); 500 | } 501 | else if due_date == "sunday" || due_date == "monday" || due_date == "tuesday" || due_date == "wednesday" || due_date == "thursday" || due_date == "friday" || due_date == "saturday"{ 502 | let mut duecp = due_date.clone(); 503 | let capsdate = duecp.remove(0).to_uppercase().to_string() + &duecp; 504 | let mut day = now; 505 | while day.format("%A").to_string() != capsdate{ 506 | day = day + Duration::days(1); 507 | } 508 | if now.format("%A").to_string() == capsdate{ 509 | day = day + Duration::days(7); 510 | } 511 | due_date = day.format("%Y-%m-%d").to_string(); 512 | } 513 | else{ 514 | println!("invalid due date. use YYYY-MM-DD or today, tomorrow, yesterday, or a day of the week"); 515 | } 516 | 517 | 518 | 519 | //create a new task and add it to the task list 520 | let task = Task { 521 | description: task_desc, 522 | due: due_date, 523 | done: false, 524 | id: next_id, 525 | }; 526 | tasks.push(task); 527 | println!("task added with id {}", next_id) 528 | } 529 | 530 | use chrono::format::strftime::StrftimeItems; 531 | 532 | fn add_auto(tasks: &mut Vec, next_id: i32, arg1: String) { 533 | let fetchtask = DateParser::parse(&arg1); 534 | let fmt = StrftimeItems::new("%Y-%m-%d"); 535 | //parse the option 536 | match fetchtask { 537 | //some or none 538 | Some(date) => { 539 | //ask user to confirm 540 | let dt = date.format_with_items(fmt.clone()).to_string(); 541 | println!("auto generated task: {} due on {}", arg1, dt); 542 | println!("confirm? (y/n)"); 543 | let mut confirm = String::new(); 544 | io::stdin().read_line(&mut confirm).expect("error"); 545 | if confirm.trim() == "y" { 546 | let task = Task { 547 | description: arg1, 548 | due: dt, 549 | done: false, 550 | id: next_id, 551 | }; 552 | tasks.push(task); 553 | println!("task added with id {}", next_id); 554 | } 555 | else { 556 | println!("task not added"); 557 | } 558 | }, 559 | None => { 560 | println!("invalid usage of auto. use --help to see usage"); 561 | } 562 | } 563 | 564 | 565 | } 566 | 567 | fn remove_task(tasks: &mut Vec, arg1: String) { 568 | //parse the task id from the arg1 string 569 | let task_id = arg1.parse::().unwrap(); 570 | //find the task with the given id and remove it from the task list 571 | let mut index = 0; 572 | for task in &mut tasks.iter() { 573 | if task.id == task_id { 574 | tasks.swap_remove(index); 575 | println!("task {} done", task_id); 576 | return; 577 | } 578 | index += 1; 579 | } 580 | println!("task with id {} not found", task_id); 581 | } 582 | 583 | 584 | fn pomodoro(arg1: String, arg2: String, arg3: String){ 585 | //we will use the chrono crate to get the current time and to calculate the time remaining 586 | //we will use indicatif to display a progress bar 587 | //if any of the arguments are empty, throw error 588 | if arg1 == "" || arg2 == "" || arg3 == "" { 589 | println!("invalid usage of pomo. use --help to see usage"); 590 | return; 591 | } 592 | let iterations = arg1.parse::().unwrap(); 593 | let work_time = arg2.parse::().unwrap(); 594 | let break_time = arg3.parse::().unwrap(); 595 | 596 | 597 | for i in 0..iterations { 598 | //reupdate end times and start times 599 | let mut now = Local::now(); 600 | let work_end = now + Duration::minutes(work_time.into()); 601 | //work session 602 | let mut pb = ProgressBar::new(work_time as u64); 603 | //make the progress bar smaller 604 | pb.set_style(indicatif::ProgressStyle::default_bar() 605 | .template("{bar:40.green/red} {msg}").expect("error")); 606 | //pb.set_message(format!("{} minutes remaining", work_time)); 607 | //figure out number of seconds in one increment (divide seconds by number of increments (40)) 608 | let mut increment = (work_time * 60) as f64 / 40.0; 609 | for j in 0..(work_time * 60) { 610 | let remaining = work_end - Local::now(); 611 | //minutes and seconds 612 | if j % increment as i32 == 0 { 613 | pb.inc(1); 614 | } 615 | pb.set_message(format!("{} minutes {} seconds remaining... work session {} of {}", remaining.num_minutes(), remaining.num_seconds() % 60, (i+1), iterations)); 616 | std::thread::sleep(std::time::Duration::from_secs(1)); 617 | 618 | } 619 | pb.set_message("work session complete".to_string()); 620 | pb.finish_and_clear(); 621 | //break session 622 | now = Local::now(); 623 | let break_end = now + Duration::minutes(break_time.into()); 624 | 625 | pb = ProgressBar::new(break_time as u64); 626 | //make the progress bar smaller 627 | pb.set_style(indicatif::ProgressStyle::default_bar() 628 | .template("{bar:40.blue/white} {msg}").expect("error")); 629 | //pb.set_message(format!("{} minutes remaining", break_time)); 630 | //figure out number of seconds in one increment (divide seconds by number of increments (40)) 631 | increment = (break_time * 60) as f64 / 40.0; 632 | for j in 0..(break_time * 60) { 633 | let remaining = break_end - Local::now(); 634 | //minutes and seconds 635 | if j % increment as i32 == 0 { 636 | pb.inc(1); 637 | } 638 | pb.set_message(format!("{} minutes {} seconds remaining... break session {} of {}", remaining.num_minutes(), remaining.num_seconds() % 60, (i+1), iterations)); 639 | std::thread::sleep(std::time::Duration::from_secs(1)); 640 | } 641 | pb.set_message("break session complete".to_string()); 642 | pb.finish_and_clear(); 643 | //clear the screen 644 | print!("{}[2J", 27 as char); 645 | } 646 | 647 | 648 | } 649 | 650 | fn read_lines

(filename: P) -> io::Result>> 651 | where P: AsRef, { 652 | let file = File::open(filename)?; 653 | Ok(io::BufReader::new(file).lines()) 654 | } 655 | 656 | fn add_event(events: &mut Vec, arg1: String, arg2: String, arg3: String, arg4: String, next_id: i32){ 657 | //if any arguments are empty, throw error 658 | if arg1 == "" || arg2 == "" || arg3 == "" { 659 | println!("invalid usage of eadd. use --help to see usage"); 660 | return; 661 | } 662 | let event_desc = arg1; 663 | let mut start_time = arg2; 664 | let mut end_time = arg3; 665 | let mut repeat = arg4; 666 | //remove \n from the end of due_date 667 | start_time = start_time.replace("\n", ""); 668 | end_time = end_time.replace("\n", ""); 669 | repeat = repeat.replace("\n", ""); 670 | println!("start time: {}", start_time); 671 | println!("end time: {}", end_time); 672 | println!("repeat: {}", repeat); 673 | //start and end time should be in the format H:MMam || H:MMpm etc. 674 | //repeat should be in the format day1,day2,day3,day4,day5,day6,day7 where dayi is a day of the week 675 | //create a new event and add it to the event list 676 | //check to make sure the above criteria are met else through error 677 | if start_time.find(":").is_none() || (start_time.find("am").is_none() && start_time.find("pm").is_none()) { 678 | println!("invalid start time format. use H:MMam or H:MMpm"); 679 | return; 680 | } 681 | if end_time.find(":").is_none() || (end_time.find("am").is_none() && end_time.find("pm").is_none()) { 682 | println!("invalid end time format. use H:MMam or H:MMpm"); 683 | return; 684 | } 685 | let repeatclone = repeat.clone(); 686 | let vecrepeat : Vec<&str> = repeatclone.split(",").collect(); 687 | //make sure all vect elements are days of the week 688 | if repeat == "everyday" { 689 | repeat = "monday,tuesday,wednesday,thursday,friday,saturday,sunday".to_string(); 690 | } 691 | if repeat == "weekday" { 692 | repeat = "monday,tuesday,wednesday,thursday,friday".to_string(); 693 | } 694 | if repeat == "weekend" { 695 | repeat = "saturday,sunday".to_string(); 696 | } 697 | if repeat != "" { 698 | for day in vecrepeat { 699 | if day != "sunday" && day != "monday" && day != "tuesday" && day != "wednesday" && day != "thursday" && day != "friday" && day != "saturday" && (repeat.matches("-").count() != 2) && day != "everyday" && day != "weekday" && day != "weekend" { 700 | println!("invalid repeat format. use subset of [monday,tuesday,wednesday,thursday,friday,saturday,sunday] separated by commas, YYYY-MM-DD, or one of [everyday,weekday,weekend]"); 701 | return; 702 | } 703 | } 704 | } 705 | else { 706 | //if repeat is empty, set repeat to date in YYYY-MM-DD format 707 | repeat = Local::now().format("%Y-%m-%d").to_string(); 708 | } 709 | //if all criteria are met, add the event to the event list 710 | let event = Event1 { 711 | description: event_desc, 712 | start: start_time, 713 | end: end_time, 714 | repeat: repeat, 715 | id: next_id, 716 | }; 717 | events.push(event); 718 | println!("event added with id {}", next_id); 719 | } 720 | 721 | fn daily_agenda(events: &mut Vec) { 722 | //get the current date 723 | let now = Local::now(); 724 | let today_date = now.format("%Y-%m-%d").to_string(); 725 | //get the day of the week as a string (monday, tuesday, etc.) 726 | //let today_day = now.format("%A").to_string(); 727 | let today_day = "wednesday"; 728 | //lowercase the day of the week 729 | let today_day = today_day.to_lowercase(); 730 | let mut todays_events : Vec = Vec::new(); 731 | //get all events that repeat on today's date or today's day of the week 732 | for event in events { 733 | if event.repeat == today_date || event.repeat.contains(&today_day) { 734 | let eventc = Event1 { 735 | description: event.description.clone(), 736 | start: event.start.clone(), 737 | end: event.end.clone(), 738 | repeat: event.repeat.clone(), 739 | id: event.id, 740 | }; 741 | todays_events.push(eventc); 742 | } 743 | } 744 | todays_events.sort_by(|e1, e2| { 745 | let e1_vec : Vec<&str> = e1.start.split(":").collect(); 746 | let e2_vec : Vec<&str> = e2.start.split(":").collect(); 747 | let mut e1_hour = e1_vec[0].to_string().parse::().unwrap(); 748 | let mut e2_hour = e2_vec[0].to_string().parse::().unwrap(); 749 | //last two characters of e1_vec[1] are am or pm 750 | let e1_ampm = &e1_vec[1][e1_vec[1].len()-2..]; 751 | let e2_ampm = &e2_vec[1][e2_vec[1].len()-2..]; 752 | //remove am or pm from e1_vec[1] and parse to int 753 | let e1_min = e1_vec[1][0..e1_vec[1].len()-2].to_string().parse::().unwrap(); 754 | let e2_min = e2_vec[1][0..e2_vec[1].len()-2].to_string().parse::().unwrap(); 755 | if e1_hour == 12 && e1_ampm == "am" { 756 | e1_hour = 0; 757 | } 758 | if e2_hour == 12 && e2_ampm == "am" { 759 | e2_hour = 0; 760 | } 761 | if e1_hour == 12 && e1_ampm == "pm" { 762 | e1_hour = 0; 763 | } 764 | if e2_hour == 12 && e2_ampm == "pm" { 765 | e2_hour = 0; 766 | } 767 | if e1_ampm == "am" && e2_ampm == "pm" { 768 | return std::cmp::Ordering::Less; 769 | } 770 | else if e1_ampm == "pm" && e2_ampm == "am" { 771 | return std::cmp::Ordering::Greater; 772 | } 773 | else if (e1_ampm == "am" && e2_ampm == "am") || (e1_ampm == "pm" && e2_ampm == "pm") { 774 | if e1_hour < e2_hour { 775 | return std::cmp::Ordering::Less; 776 | } 777 | else if e1_hour > e2_hour { 778 | return std::cmp::Ordering::Greater; 779 | } 780 | else { 781 | if e1_min < e2_min { 782 | return std::cmp::Ordering::Less; 783 | } 784 | else if e1_min > e2_min { 785 | return std::cmp::Ordering::Greater; 786 | } 787 | else { 788 | return std::cmp::Ordering::Equal; 789 | } 790 | } 791 | } 792 | else { 793 | return std::cmp::Ordering::Equal; 794 | } 795 | }); 796 | //display the events 797 | println!("Today's Agenda"); 798 | println!("---------------------------------"); 799 | if todays_events.len() == 0 { 800 | println!("No events today."); 801 | } 802 | for event in todays_events { 803 | //pad the start and end time with spaces to be len 7 804 | let mut start_time = event.start; 805 | while start_time.len() < 7 { 806 | start_time.push(' '); 807 | } 808 | let mut end_time = event.end; 809 | while end_time.len() < 7 { 810 | end_time.push(' '); 811 | } 812 | println!("{} - {} - {}", start_time, end_time, event.description); 813 | } 814 | 815 | } 816 | 817 | fn list_event_ids(events: &mut Vec) { 818 | for event in events { 819 | println!("{} - {}", event.description, event.id); 820 | } 821 | 822 | } 823 | 824 | fn remove_event(events: &mut Vec, arg1: String) { 825 | //parse the event id from the arg1 string 826 | let event_id = arg1.parse::().unwrap(); 827 | //find the event with the given id and remove it from the event list 828 | let mut index = 0; 829 | for event in &mut events.iter() { 830 | if event.id == event_id { 831 | events.swap_remove(index); 832 | println!("event {} done", event_id); 833 | return; 834 | } 835 | index += 1; 836 | } 837 | println!("event with id {} not found", event_id); 838 | } 839 | 840 | fn vayu_ui(tasks: &mut Vec, events: &mut Vec) -> io::Result<()> { 841 | //ratatui ui with task list, calendar, and quote of the day 842 | //layout 843 | // *vayu* 844 | // quote of the day 845 | // task list weekly calendar 846 | let task_clone : &mut Vec = tasks; 847 | let event_clone : &mut Vec = events; 848 | enable_raw_mode()?; 849 | stdout().execute(EnterAlternateScreen)?; 850 | let mut terminal = Terminal::new(CrosstermBackend::new(stdout()))?; 851 | 852 | let mut should_quit = false; 853 | while !should_quit { 854 | terminal.draw(|f| ui(f, task_clone, event_clone))?; 855 | if event::poll(std::time::Duration::from_millis(50))? { 856 | if let UIEvent::Key(key) = event::read()? { 857 | //if key is q, quit 858 | if key.kind == event::KeyEventKind::Press && key.code == KeyCode::Char('q') { 859 | should_quit = true; 860 | } 861 | } 862 | } 863 | } 864 | 865 | disable_raw_mode()?; 866 | stdout().execute(LeaveAlternateScreen)?; 867 | Ok(()) 868 | } 869 | 870 | fn ui(frame: &mut Frame, tasks: &mut Vec, events: &mut Vec) { 871 | //main window 872 | let main_layout = Layout::new( 873 | Direction::Vertical, 874 | [ 875 | Constraint::Length(2), 876 | Constraint::Min(0), 877 | Constraint::Percentage(40), 878 | ] 879 | ).split(frame.size()); 880 | 881 | let agenda_layout = Layout::new( 882 | Direction::Horizontal, 883 | [ 884 | Constraint::Percentage(4), 885 | Constraint::Percentage(14), 886 | Constraint::Percentage(14), 887 | Constraint::Percentage(14), 888 | Constraint::Percentage(14), 889 | Constraint::Percentage(14), 890 | Constraint::Percentage(14), 891 | Constraint::Percentage(14), 892 | ] 893 | ).split(main_layout[2]); 894 | 895 | //one box for each day of the week starting with today as the second box 896 | //get the current date 897 | let now = Local::now(); 898 | let today_date = now.format("%Y-%m-%d").to_string(); 899 | //render a box with each date and day of the week starting at yesterday 900 | let mut day = now - Duration::days(1); 901 | for i in 0..7 { 902 | let day_date = day.format("%Y-%m-%d").to_string(); 903 | let day_day = day.format("%A").to_string(); 904 | let day_day = day_day.to_lowercase(); 905 | //make a string with date + day 906 | let mut day_str = day_date.clone(); 907 | let mut cat_day = day_day.clone(); 908 | cat_day.truncate(3); 909 | day_str.push_str(" "); 910 | day_str.push_str(&cat_day); 911 | let day_box = Block::default().title(day_str.clone()); 912 | //rendering the calendar 913 | let mut todays_events : Vec = Vec::new(); 914 | for event in &mut *events { 915 | if event.repeat == day_date || event.repeat.contains(&day_day) { 916 | let eventc = Event1 { 917 | description: event.description.clone(), 918 | start: event.start.clone(), 919 | end: event.end.clone(), 920 | repeat: event.repeat.clone(), 921 | id: event.id, 922 | }; 923 | todays_events.push(eventc); 924 | } 925 | } 926 | todays_events.sort_by(|e1, e2| { 927 | let e1_vec : Vec<&str> = e1.start.split(":").collect(); 928 | let e2_vec : Vec<&str> = e2.start.split(":").collect(); 929 | let mut e1_hour = e1_vec[0].to_string().parse::().unwrap(); 930 | let mut e2_hour = e2_vec[0].to_string().parse::().unwrap(); 931 | //last two characters of e1_vec[1] are am or pm 932 | let e1_ampm = &e1_vec[1][e1_vec[1].len()-2..]; 933 | let e2_ampm = &e2_vec[1][e2_vec[1].len()-2..]; 934 | //remove am or pm from e1_vec[1] and parse to int 935 | let e1_min = e1_vec[1][0..e1_vec[1].len()-2].to_string().parse::().unwrap(); 936 | let e2_min = e2_vec[1][0..e2_vec[1].len()-2].to_string().parse::().unwrap(); 937 | if e1_hour == 12 && e1_ampm == "am" { 938 | e1_hour = 0; 939 | } 940 | if e2_hour == 12 && e2_ampm == "am" { 941 | e2_hour = 0; 942 | } 943 | if e1_hour == 12 && e1_ampm == "pm" { 944 | e1_hour = 0; 945 | } 946 | if e2_hour == 12 && e2_ampm == "pm" { 947 | e2_hour = 0; 948 | } 949 | if e1_ampm == "am" && e2_ampm == "pm" { 950 | return std::cmp::Ordering::Less; 951 | } 952 | else if e1_ampm == "pm" && e2_ampm == "am" { 953 | return std::cmp::Ordering::Greater; 954 | } 955 | else if (e1_ampm == "am" && e2_ampm == "am") || (e1_ampm == "pm" && e2_ampm == "pm") { 956 | if e1_hour < e2_hour { 957 | return std::cmp::Ordering::Less; 958 | } 959 | else if e1_hour > e2_hour { 960 | return std::cmp::Ordering::Greater; 961 | } 962 | else { 963 | if e1_min < e2_min { 964 | return std::cmp::Ordering::Less; 965 | } 966 | else if e1_min > e2_min { 967 | return std::cmp::Ordering::Greater; 968 | } 969 | else { 970 | return std::cmp::Ordering::Equal; 971 | } 972 | } 973 | } 974 | else { 975 | return std::cmp::Ordering::Equal; 976 | } 977 | }); 978 | //make a table with start time + description of events in todays_events and place it in the box 979 | let rows = todays_events.iter().map(|event| Row::new(vec![ 980 | event.start.clone(), 981 | event.description.clone(), 982 | ])); 983 | let widths = [Constraint::Length(7), Constraint::Length(20)]; 984 | let mut table = Table::new(rows, widths) 985 | .block(day_box) 986 | //.header(Row::new(vec!["Start", "Description"]).bottom_margin(1).style(Style::default().fg(Color::Yellow).add_modifier(Modifier::BOLD))) 987 | .style(Style::default().fg(Color::White).bg(Color::Black)) 988 | .highlight_style(Style::default().add_modifier(Modifier::BOLD)) 989 | .highlight_symbol(">>"); 990 | if day_date == today_date { 991 | table = table.style(Style::default().fg(Color::Green).bg(Color::Black)); 992 | } 993 | frame.render_widget(table, agenda_layout[i+1]); 994 | day = day + Duration::days(1); 995 | } 996 | let block = Block::default().style(Style::default().fg(Color::Red).add_modifier(Modifier::BOLD).bg(Color::Black)); 997 | frame.render_widget(block, agenda_layout[0]); 998 | 999 | let taskevents_layout = Layout::new( 1000 | Direction::Horizontal, 1001 | [ 1002 | Constraint::Percentage(4), 1003 | Constraint::Percentage(48), 1004 | Constraint::Percentage(48), 1005 | ] 1006 | ).split(main_layout[1]); 1007 | 1008 | //border on top and bottom 1009 | frame.render_widget( 1010 | Block::new().title("vayu dashboard - press 'q' to quit").title_alignment(Alignment::Center).style(Style::default().fg(Color::Blue).bg(Color::Black)), 1011 | main_layout[0], 1012 | ); 1013 | 1014 | let mut table_state = TableState::default(); 1015 | 1016 | let block_padding = Block::default().style(Style::default().fg(Color::White).bg(Color::Black)); 1017 | frame.render_widget(block_padding, taskevents_layout[0]); 1018 | 1019 | //rendering the task list 1020 | let rows = tasks.iter().map(|task| Row::new(vec![ 1021 | task.id.to_string(), 1022 | task.due.clone(), 1023 | task.description.clone(), 1024 | ])); 1025 | let widths = [Constraint::Length(4), Constraint::Length(10), Constraint::Length(20)]; 1026 | let table = Table::new(rows, widths) 1027 | .block(Block::default().title("Task List")) 1028 | .header(Row::new(vec![" ", " ", " "]).bottom_margin(1).style(Style::default().fg(Color::Yellow).add_modifier(Modifier::BOLD))) 1029 | .style(Style::default().fg(Color::White).bg(Color::Black)) 1030 | .highlight_style(Style::default().add_modifier(Modifier::BOLD)) 1031 | .highlight_symbol(">>"); 1032 | frame.render_stateful_widget(table, taskevents_layout[1], &mut table_state); 1033 | 1034 | //rendering the event list 1035 | let rows = events.iter().map(|event| Row::new(vec![ 1036 | event.id.to_string(), 1037 | event.start.clone(), 1038 | event.end.clone(), 1039 | event.description.clone(), 1040 | event.repeat.clone().replace("monday,tuesday,wednesday,thursday,friday,saturday,sunday", "everyday").replace("monday,tuesday,wednesday,thursday,friday", "weekday").replace("saturday,sunday", "weekend"), 1041 | ])); 1042 | let widths = [Constraint::Length(4), Constraint::Length(10), Constraint::Length(10), Constraint::Length(20), Constraint::Length(20)]; 1043 | let table = Table::new(rows, widths) 1044 | .block(Block::default().title("Event1 List")) 1045 | .header(Row::new(vec![" ", " ", " ", " "," "]).bottom_margin(1).style(Style::default().fg(Color::Yellow).add_modifier(Modifier::BOLD))) 1046 | .style(Style::default().fg(Color::White).bg(Color::Black)) 1047 | .highlight_style(Style::default().add_modifier(Modifier::BOLD)) 1048 | .highlight_symbol(">>"); 1049 | frame.render_stateful_widget(table, taskevents_layout[2], &mut table_state); 1050 | } 1051 | 1052 | fn news() { 1053 | //formatted string with https://www.google.com/search?client=firefox-b-1-d&q= and arg1 1054 | let search = format!("https://news.ycombinator.com/"); 1055 | let response = reqwest::blocking::get( 1056 | search, 1057 | ) 1058 | .unwrap() 1059 | .text() 1060 | .unwrap(); 1061 | 1062 | let document = scraper::Html::parse_document(&response); 1063 | 1064 | //pick the elements that have href and print them 1065 | let selector = scraper::Selector::parse("a").unwrap(); 1066 | for element in document.select(&selector) { 1067 | let href = element.value().attr("href").unwrap_or(""); 1068 | //get text of the element 1069 | let text = element.text().collect::>(); 1070 | let text = text.join(" "); 1071 | //if href is not empty and starts with http print it 1072 | if text == "API" { 1073 | break; 1074 | } 1075 | if text != "" && href != "" && href != " " && href.contains("http") { 1076 | println!(""); 1077 | println!("{}",text.green()); 1078 | println!("{}",href.blue()); 1079 | } 1080 | 1081 | } 1082 | } 1083 | -------------------------------------------------------------------------------- /src/tasks.txt: -------------------------------------------------------------------------------- 1 | scale ai application due aug 22%2024-08-22%false%1 2 | scale ai application due aug 22%2024-08-22%false%2 3 | -------------------------------------------------------------------------------- /tasks.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MythicalCow/vayu/7d8eadea134fd362bfa80078c62b80270526e929/tasks.txt -------------------------------------------------------------------------------- /todo.txt: -------------------------------------------------------------------------------- 1 | Project Management Architecture 2 | Notekeeping System --------------------------------------------------------------------------------