colon prompt YES
This commit is contained in:
parent
95a50a6764
commit
555727e007
9 changed files with 807 additions and 53 deletions
636
Cargo.lock
generated
636
Cargo.lock
generated
|
@ -6,6 +6,12 @@ version = "1.0.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
|
||||
|
||||
[[package]]
|
||||
name = "ahash"
|
||||
version = "0.3.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217"
|
||||
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "0.7.15"
|
||||
|
@ -30,6 +36,15 @@ version = "1.0.38"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "afddf7f520a80dbf76e6f50a35bca42a2331ef227a28b3b6dc5c2e2338d114b1"
|
||||
|
||||
[[package]]
|
||||
name = "archery"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d308d8fa3f687f7a7588fccc4812ed6914be09518232f00454693a7417273ad2"
|
||||
dependencies = [
|
||||
"static_assertions",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "arrayref"
|
||||
version = "0.3.6"
|
||||
|
@ -42,6 +57,15 @@ version = "0.5.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
|
||||
|
||||
[[package]]
|
||||
name = "ascii-canvas"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ff8eb72df928aafb99fe5d37b383f2fe25bd2a765e3e5f7c365916b6f2463a29"
|
||||
dependencies = [
|
||||
"term",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "assert_matches"
|
||||
version = "1.5.0"
|
||||
|
@ -102,6 +126,21 @@ version = "0.13.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
|
||||
|
||||
[[package]]
|
||||
name = "bit-set"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
|
||||
dependencies = [
|
||||
"bit-vec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bit-vec"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "0.9.1"
|
||||
|
@ -170,6 +209,12 @@ version = "1.4.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b"
|
||||
|
||||
[[package]]
|
||||
name = "bytes"
|
||||
version = "0.5.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38"
|
||||
|
||||
[[package]]
|
||||
name = "bytes"
|
||||
version = "1.0.1"
|
||||
|
@ -201,7 +246,7 @@ dependencies = [
|
|||
"clap",
|
||||
"core-foundation",
|
||||
"crates-io",
|
||||
"crossbeam-utils",
|
||||
"crossbeam-utils 0.8.3",
|
||||
"crypto-hash",
|
||||
"curl",
|
||||
"curl-sys",
|
||||
|
@ -321,6 +366,31 @@ dependencies = [
|
|||
"vec_map",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "codespan"
|
||||
version = "0.9.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8ebaf6bb6a863ad6aa3a18729e9710c53d75df03306714d9cc1f7357a00cd789"
|
||||
dependencies = [
|
||||
"codespan-reporting",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "codespan-reporting"
|
||||
version = "0.9.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e0762455306b1ed42bc651ef6a2197aabda5e1d4a43c34d5eab5c1a3634e81d"
|
||||
dependencies = [
|
||||
"termcolor",
|
||||
"unicode-width",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "collect-mac"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f168712e49987bd2f51cb855c4585999e12b1a0abdff60fea4b81b41f2010264"
|
||||
|
||||
[[package]]
|
||||
name = "colored"
|
||||
version = "1.9.3"
|
||||
|
@ -411,6 +481,17 @@ dependencies = [
|
|||
"cfg-if 1.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"cfg-if 0.1.10",
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.3"
|
||||
|
@ -472,6 +553,12 @@ dependencies = [
|
|||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crunchy"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
|
||||
|
||||
[[package]]
|
||||
name = "crypto-hash"
|
||||
version = "0.3.4"
|
||||
|
@ -586,6 +673,12 @@ dependencies = [
|
|||
"syn 1.0.62",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "diff"
|
||||
version = "0.1.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499"
|
||||
|
||||
[[package]]
|
||||
name = "digest"
|
||||
version = "0.9.0"
|
||||
|
@ -606,6 +699,27 @@ dependencies = [
|
|||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "downcast-rs"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
||||
|
||||
[[package]]
|
||||
name = "ena"
|
||||
version = "0.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7402b94a93c24e742487327a7cd839dc9d36fec9de9fb25b09f2dae459f36c3"
|
||||
dependencies = [
|
||||
"log",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "enumflags2"
|
||||
version = "0.6.4"
|
||||
|
@ -671,6 +785,12 @@ dependencies = [
|
|||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fixedbitset"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d"
|
||||
|
||||
[[package]]
|
||||
name = "flate2"
|
||||
version = "1.0.20"
|
||||
|
@ -737,6 +857,18 @@ dependencies = [
|
|||
"syn 1.0.62",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "frunk_core"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e04cda45add94e71c2990de778ae13059897d77b773130a9bc225e2970c413e"
|
||||
|
||||
[[package]]
|
||||
name = "futures"
|
||||
version = "0.1.31"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678"
|
||||
|
||||
[[package]]
|
||||
name = "futures"
|
||||
version = "0.3.13"
|
||||
|
@ -796,7 +928,7 @@ dependencies = [
|
|||
"futures-io",
|
||||
"memchr",
|
||||
"parking",
|
||||
"pin-project-lite",
|
||||
"pin-project-lite 0.2.6",
|
||||
"waker-fn",
|
||||
]
|
||||
|
||||
|
@ -830,6 +962,7 @@ version = "0.3.13"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1"
|
||||
dependencies = [
|
||||
"futures 0.1.31",
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-io",
|
||||
|
@ -837,7 +970,7 @@ dependencies = [
|
|||
"futures-sink",
|
||||
"futures-task",
|
||||
"memchr",
|
||||
"pin-project-lite",
|
||||
"pin-project-lite 0.2.6",
|
||||
"pin-utils",
|
||||
"proc-macro-hack",
|
||||
"proc-macro-nested",
|
||||
|
@ -932,6 +1065,199 @@ dependencies = [
|
|||
"regex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gluon"
|
||||
version = "0.17.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "268e1d6205e87e79bd9d6f18f85e55d892c354395f3a00e600fc98fd4f5da584"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"codespan",
|
||||
"codespan-reporting",
|
||||
"collect-mac",
|
||||
"either",
|
||||
"futures 0.3.13",
|
||||
"gluon-salsa",
|
||||
"gluon_base",
|
||||
"gluon_check",
|
||||
"gluon_codegen",
|
||||
"gluon_format",
|
||||
"gluon_parser",
|
||||
"gluon_vm",
|
||||
"itertools 0.9.0",
|
||||
"log",
|
||||
"quick-error",
|
||||
"rand 0.7.3",
|
||||
"rand_xorshift",
|
||||
"regex",
|
||||
"tokio 0.2.25",
|
||||
"walkdir",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gluon-salsa"
|
||||
version = "0.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4644d498c04e71e60947f837bf9729379bd922e5b745c36bea5a4ce03e551fe5"
|
||||
dependencies = [
|
||||
"crossbeam-utils 0.7.2",
|
||||
"futures-channel",
|
||||
"futures-util",
|
||||
"gluon-salsa-macros",
|
||||
"indexmap",
|
||||
"lock_api",
|
||||
"log",
|
||||
"oorandom",
|
||||
"parking_lot",
|
||||
"rustc-hash",
|
||||
"smallvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gluon-salsa-macros"
|
||||
version = "0.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "807a2b17a92e21080379cf696063642c70caea95c04b547320d37fd6844b8e0f"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
"quote 1.0.9",
|
||||
"syn 1.0.62",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gluon_base"
|
||||
version = "0.17.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "60e22691ead91365f5b1641eee9c21d5b794a5ff0cb6671272a844ced44e30de"
|
||||
dependencies = [
|
||||
"bitflags 1.2.1",
|
||||
"codespan",
|
||||
"codespan-reporting",
|
||||
"collect-mac",
|
||||
"either",
|
||||
"fnv",
|
||||
"gluon_codegen",
|
||||
"hashbrown 0.8.2",
|
||||
"itertools 0.9.0",
|
||||
"log",
|
||||
"ordered-float",
|
||||
"pretty",
|
||||
"quick-error",
|
||||
"smallvec",
|
||||
"typed-arena",
|
||||
"vec_map",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gluon_check"
|
||||
version = "0.17.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e005ef6f8085599dc3edaa3f2ae97945312c230fd3937998816802e62216d229"
|
||||
dependencies = [
|
||||
"codespan",
|
||||
"codespan-reporting",
|
||||
"collect-mac",
|
||||
"ena",
|
||||
"gluon_base",
|
||||
"gluon_codegen",
|
||||
"itertools 0.9.0",
|
||||
"log",
|
||||
"pretty",
|
||||
"quick-error",
|
||||
"rpds",
|
||||
"smallvec",
|
||||
"strsim 0.10.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gluon_codegen"
|
||||
version = "0.17.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2ad77fad378e1a0156134c1fefdc8692cdb31ffa6c5bf40e30bed8aee1de53a2"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote 1.0.9",
|
||||
"syn 1.0.62",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gluon_format"
|
||||
version = "0.17.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dda2b7cece2002340bcd47de0b945019c4030f40a9d4a10ebe3a65d0d4319fb1"
|
||||
dependencies = [
|
||||
"codespan",
|
||||
"gluon_base",
|
||||
"itertools 0.9.0",
|
||||
"log",
|
||||
"pretty",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gluon_parser"
|
||||
version = "0.17.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8060f7e81f98391ecc7d045923be48f1d06235f3500bc359b59b3220086cb6c4"
|
||||
dependencies = [
|
||||
"codespan",
|
||||
"codespan-reporting",
|
||||
"collect-mac",
|
||||
"gluon_base",
|
||||
"itertools 0.9.0",
|
||||
"lalrpop",
|
||||
"lalrpop-util",
|
||||
"log",
|
||||
"ordered-float",
|
||||
"quick-error",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gluon_vm"
|
||||
version = "0.17.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "14bed68cb204682626f56a4728759fc1feb7fd9b3af3173496b70e8bd690a8ef"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"bitflags 1.2.1",
|
||||
"codespan",
|
||||
"codespan-reporting",
|
||||
"collect-mac",
|
||||
"crossbeam-utils 0.7.2",
|
||||
"downcast-rs",
|
||||
"frunk_core",
|
||||
"futures 0.3.13",
|
||||
"gluon_base",
|
||||
"gluon_check",
|
||||
"gluon_codegen",
|
||||
"itertools 0.9.0",
|
||||
"log",
|
||||
"ordered-float",
|
||||
"parking_lot",
|
||||
"petgraph",
|
||||
"pretty",
|
||||
"quick-error",
|
||||
"slab",
|
||||
"smallvec",
|
||||
"typed-arena",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e91b62f79061a0bc2e046024cb7ba44b08419ed238ecbd9adbd787434b9e8c25"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.3.2"
|
||||
|
@ -1000,7 +1326,7 @@ version = "0.4.17"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b287fb45c60bb826a0dc68ff08742b9d88a2fea13d6e0c286b3172065aaf878c"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
"crossbeam-utils 0.8.3",
|
||||
"globset",
|
||||
"lazy_static",
|
||||
"log",
|
||||
|
@ -1026,6 +1352,16 @@ dependencies = [
|
|||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "1.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"hashbrown 0.9.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "inotify"
|
||||
version = "0.9.2"
|
||||
|
@ -1036,7 +1372,7 @@ dependencies = [
|
|||
"futures-core",
|
||||
"inotify-sys",
|
||||
"libc",
|
||||
"tokio",
|
||||
"tokio 1.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1057,6 +1393,24 @@ dependencies = [
|
|||
"cfg-if 1.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37d572918e350e82412fe766d24b15e6682fb2ed2bbe018280caa810397cb319"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "0.4.7"
|
||||
|
@ -1081,6 +1435,38 @@ dependencies = [
|
|||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lalrpop"
|
||||
version = "0.19.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "46962a8c71b91c3524b117dfdd70844d4265a173c4c9109f98171aebdcf1195f"
|
||||
dependencies = [
|
||||
"ascii-canvas",
|
||||
"atty",
|
||||
"bit-set",
|
||||
"diff",
|
||||
"ena",
|
||||
"itertools 0.10.0",
|
||||
"lalrpop-util",
|
||||
"petgraph",
|
||||
"pico-args",
|
||||
"regex",
|
||||
"regex-syntax",
|
||||
"string_cache",
|
||||
"term",
|
||||
"tiny-keccak",
|
||||
"unicode-xid 0.2.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lalrpop-util"
|
||||
version = "0.19.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7a708007b751af124d09e9c5d97515257902bc6b486a56b40bcafd939e8ff467"
|
||||
dependencies = [
|
||||
"regex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.4.0"
|
||||
|
@ -1249,6 +1635,12 @@ dependencies = [
|
|||
"socket2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "new_debug_unreachable"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
|
||||
|
||||
[[package]]
|
||||
name = "nix"
|
||||
version = "0.17.0"
|
||||
|
@ -1349,6 +1741,12 @@ version = "1.7.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"
|
||||
|
||||
[[package]]
|
||||
name = "oorandom"
|
||||
version = "11.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
|
||||
|
||||
[[package]]
|
||||
name = "opaque-debug"
|
||||
version = "0.3.0"
|
||||
|
@ -1397,6 +1795,15 @@ dependencies = [
|
|||
"vcpkg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ordered-float"
|
||||
version = "2.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "766f840da25490628d8e63e529cd21c014f6600c6b8517add12a6fa6167a6218"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "panorama"
|
||||
version = "0.0.1"
|
||||
|
@ -1407,9 +1814,11 @@ dependencies = [
|
|||
"chrono",
|
||||
"chrono-humanize",
|
||||
"crossterm 0.19.0",
|
||||
"downcast-rs",
|
||||
"fern",
|
||||
"format-bytes",
|
||||
"futures",
|
||||
"futures 0.3.13",
|
||||
"gluon",
|
||||
"inotify",
|
||||
"log",
|
||||
"notify-rust",
|
||||
|
@ -1418,7 +1827,7 @@ dependencies = [
|
|||
"parking_lot",
|
||||
"serde",
|
||||
"structopt",
|
||||
"tokio",
|
||||
"tokio 1.2.0",
|
||||
"tokio-rustls",
|
||||
"tokio-stream",
|
||||
"tokio-util",
|
||||
|
@ -1435,15 +1844,15 @@ dependencies = [
|
|||
"anyhow",
|
||||
"assert_matches",
|
||||
"async-trait",
|
||||
"bytes",
|
||||
"bytes 1.0.1",
|
||||
"chrono",
|
||||
"derive_builder",
|
||||
"futures",
|
||||
"futures 0.3.13",
|
||||
"log",
|
||||
"parking_lot",
|
||||
"pest",
|
||||
"pest_derive",
|
||||
"tokio",
|
||||
"tokio 1.2.0",
|
||||
"tokio-rustls",
|
||||
"tokio-util",
|
||||
"webpki-roots",
|
||||
|
@ -1531,6 +1940,37 @@ dependencies = [
|
|||
"sha-1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "petgraph"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7"
|
||||
dependencies = [
|
||||
"fixedbitset",
|
||||
"indexmap",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "phf_shared"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
|
||||
dependencies = [
|
||||
"siphasher",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pico-args"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d70072c20945e1ab871c472a285fc772aefd4f5407723c206242f2c6f94595d6"
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.1.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777"
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.2.6"
|
||||
|
@ -1568,6 +2008,22 @@ version = "0.2.10"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
|
||||
|
||||
[[package]]
|
||||
name = "precomputed-hash"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
|
||||
|
||||
[[package]]
|
||||
name = "pretty"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ad9940b913ee56ddd94aec2d3cd179dd47068236f42a1a6415ccf9d880ce2a61"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"typed-arena",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-crate"
|
||||
version = "0.1.5"
|
||||
|
@ -1622,6 +2078,12 @@ dependencies = [
|
|||
"unicode-xid 0.2.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quick-error"
|
||||
version = "1.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "0.3.15"
|
||||
|
@ -1637,6 +2099,19 @@ dependencies = [
|
|||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.7.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
|
||||
dependencies = [
|
||||
"getrandom 0.1.16",
|
||||
"libc",
|
||||
"rand_chacha 0.2.2",
|
||||
"rand_core 0.5.1",
|
||||
"rand_hc 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.8.3"
|
||||
|
@ -1644,9 +2119,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"rand_chacha",
|
||||
"rand_chacha 0.3.0",
|
||||
"rand_core 0.6.2",
|
||||
"rand_hc",
|
||||
"rand_hc 0.3.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_chacha"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
|
||||
dependencies = [
|
||||
"ppv-lite86",
|
||||
"rand_core 0.5.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1664,6 +2149,9 @@ name = "rand_core"
|
|||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
|
||||
dependencies = [
|
||||
"getrandom 0.1.16",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
|
@ -1674,6 +2162,15 @@ dependencies = [
|
|||
"getrandom 0.2.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_hc"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
|
||||
dependencies = [
|
||||
"rand_core 0.5.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_hc"
|
||||
version = "0.3.0"
|
||||
|
@ -1683,6 +2180,15 @@ dependencies = [
|
|||
"rand_core 0.6.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_xorshift"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8"
|
||||
dependencies = [
|
||||
"rand_core 0.5.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_xoshiro"
|
||||
version = "0.4.0"
|
||||
|
@ -1760,6 +2266,15 @@ dependencies = [
|
|||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rpds"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1196a0a2f52d343bd32179834273eaac7d8739f7e3f8b700227d2fa06b9a423b"
|
||||
dependencies = [
|
||||
"archery",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rust-argon2"
|
||||
version = "0.8.3"
|
||||
|
@ -1769,9 +2284,15 @@ dependencies = [
|
|||
"base64",
|
||||
"blake2b_simd",
|
||||
"constant_time_eq",
|
||||
"crossbeam-utils",
|
||||
"crossbeam-utils 0.8.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-workspace-hack"
|
||||
version = "1.0.0"
|
||||
|
@ -1956,6 +2477,12 @@ dependencies = [
|
|||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "siphasher"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa8f3741c7372e75519bd9346068370c9cdaabcc1f9599cbcf2a2719352286b7"
|
||||
|
||||
[[package]]
|
||||
name = "sized-chunks"
|
||||
version = "0.6.4"
|
||||
|
@ -1995,6 +2522,24 @@ version = "0.5.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
|
||||
|
||||
[[package]]
|
||||
name = "static_assertions"
|
||||
version = "0.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f3eb36b47e512f8f1c9e3d10c2c1965bc992bd9cdb024fa581e2194501c83d3"
|
||||
|
||||
[[package]]
|
||||
name = "string_cache"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8ddb1139b5353f96e429e1a5e19fbaf663bddedaa06d1dbd49f82e352601209a"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
"new_debug_unreachable",
|
||||
"phf_shared",
|
||||
"precomputed-hash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strip-ansi-escapes"
|
||||
version = "0.1.0"
|
||||
|
@ -2016,6 +2561,12 @@ version = "0.9.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||
|
||||
[[package]]
|
||||
name = "structopt"
|
||||
version = "0.3.21"
|
||||
|
@ -2105,12 +2656,23 @@ checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
|
|||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"libc",
|
||||
"rand",
|
||||
"rand 0.8.3",
|
||||
"redox_syscall 0.2.5",
|
||||
"remove_dir_all",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "term"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "edd106a334b7657c10b7c540a0106114feadeb4dc314513e97df481d5d966f42"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"dirs",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "termcolor"
|
||||
version = "1.1.2"
|
||||
|
@ -2149,6 +2711,15 @@ dependencies = [
|
|||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tiny-keccak"
|
||||
version = "2.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
|
||||
dependencies = [
|
||||
"crunchy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tinyvec"
|
||||
version = "1.1.1"
|
||||
|
@ -2164,6 +2735,19 @@ version = "0.1.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "0.2.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092"
|
||||
dependencies = [
|
||||
"bytes 0.5.6",
|
||||
"fnv",
|
||||
"futures-core",
|
||||
"pin-project-lite 0.1.12",
|
||||
"slab",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.2.0"
|
||||
|
@ -2171,14 +2755,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "e8190d04c665ea9e6b6a0dc45523ade572c088d2e6566244c1122671dbf4ae3a"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"bytes",
|
||||
"bytes 1.0.1",
|
||||
"libc",
|
||||
"memchr",
|
||||
"mio",
|
||||
"num_cpus",
|
||||
"once_cell",
|
||||
"parking_lot",
|
||||
"pin-project-lite",
|
||||
"pin-project-lite 0.2.6",
|
||||
"signal-hook-registry",
|
||||
"tokio-macros",
|
||||
"winapi",
|
||||
|
@ -2202,7 +2786,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6"
|
||||
dependencies = [
|
||||
"rustls",
|
||||
"tokio",
|
||||
"tokio 1.2.0",
|
||||
"webpki",
|
||||
]
|
||||
|
||||
|
@ -2213,8 +2797,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "1981ad97df782ab506a1f43bf82c967326960d278acf3bf8279809648c3ff3ea"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"pin-project-lite",
|
||||
"tokio",
|
||||
"pin-project-lite 0.2.6",
|
||||
"tokio 1.2.0",
|
||||
"tokio-util",
|
||||
]
|
||||
|
||||
|
@ -2224,14 +2808,14 @@ version = "0.6.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebb7cb2f00c5ae8df755b252306272cd1790d39728363936e01827e11f0b017b"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"bytes 1.0.1",
|
||||
"futures-core",
|
||||
"futures-io",
|
||||
"futures-sink",
|
||||
"log",
|
||||
"pin-project-lite",
|
||||
"pin-project-lite 0.2.6",
|
||||
"slab",
|
||||
"tokio",
|
||||
"tokio 1.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -2256,6 +2840,12 @@ dependencies = [
|
|||
"unicode-width",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typed-arena"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae"
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.12.0"
|
||||
|
@ -2573,7 +3163,7 @@ dependencies = [
|
|||
"derivative",
|
||||
"enumflags2",
|
||||
"fastrand",
|
||||
"futures",
|
||||
"futures 0.3.13",
|
||||
"nb-connect",
|
||||
"nix",
|
||||
"once_cell",
|
||||
|
|
|
@ -12,19 +12,20 @@ license = "GPL-3.0-or-later"
|
|||
members = ["imap", "smtp"]
|
||||
|
||||
[dependencies]
|
||||
crossterm = "0.19.0"
|
||||
anyhow = "1.0.38"
|
||||
async-trait = "0.1.48"
|
||||
cfg-if = "1.0.0"
|
||||
chrono = "0.4.19"
|
||||
chrono-humanize = "0.1.2"
|
||||
crossterm = "0.19.0"
|
||||
fern = { version = "0.6.0", features = ["colored"] }
|
||||
format-bytes = "0.2.2"
|
||||
futures = "0.3.13"
|
||||
gluon = "0.17.2"
|
||||
inotify = { version = "0.9.2", features = ["stream"] }
|
||||
log = "0.4.14"
|
||||
notify-rust = { version = "4.3.0", default-features = false, features = ["z"] }
|
||||
parking_lot = "0.11.1"
|
||||
# pgp = "0.7.1"
|
||||
serde = { version = "1.0.124", features = ["derive"] }
|
||||
structopt = "0.3.21"
|
||||
tokio = { version = "1.2.0", features = ["full"] }
|
||||
|
@ -35,7 +36,7 @@ toml = "0.5.8"
|
|||
tui = { version = "0.14.0", default-features = false, features = ["crossterm"] }
|
||||
webpki-roots = "0.21.0"
|
||||
xdg = "2.2.0"
|
||||
chrono-humanize = "0.1.2"
|
||||
downcast-rs = "1.2.0"
|
||||
|
||||
[dependencies.panorama-imap]
|
||||
path = "imap"
|
||||
|
|
|
@ -24,10 +24,3 @@ pub mod codec;
|
|||
pub mod command;
|
||||
pub mod parser;
|
||||
pub mod response;
|
||||
|
||||
// pub mod builders;
|
||||
// pub mod oldparser;
|
||||
// pub mod types;
|
||||
|
||||
// pub use crate::oldparser::ParseResult;
|
||||
// pub use crate::types::*;
|
||||
|
|
|
@ -19,6 +19,7 @@ extern crate log;
|
|||
|
||||
pub mod config;
|
||||
pub mod mail;
|
||||
pub mod script;
|
||||
pub mod ui;
|
||||
|
||||
/// A cloneable type that allows sending an exit-"signal" to stop the application.
|
||||
|
|
11
src/script.rs
Normal file
11
src/script.rs
Normal file
|
@ -0,0 +1,11 @@
|
|||
//! Everything dealing with scripting
|
||||
|
||||
use anyhow::Result;
|
||||
use gluon::{import::add_extern_module, ThreadExt};
|
||||
|
||||
/// Creates a VM for running scripts
|
||||
pub async fn create_script_vm() -> Result<()> {
|
||||
let vm = gluon::new_vm_async().await;
|
||||
|
||||
Ok(())
|
||||
}
|
47
src/ui/colon_prompt.rs
Normal file
47
src/ui/colon_prompt.rs
Normal file
|
@ -0,0 +1,47 @@
|
|||
use anyhow::Result;
|
||||
use crossterm::event::{KeyCode, KeyEvent};
|
||||
|
||||
use super::input::{HandlesInput, InputResult};
|
||||
use super::TermType;
|
||||
|
||||
#[derive(Clone, Default, Debug)]
|
||||
pub struct ColonPrompt {
|
||||
pub value: String,
|
||||
}
|
||||
|
||||
impl ColonPrompt {
|
||||
pub fn init(term: TermType) -> Self {
|
||||
let s = term.size().unwrap();
|
||||
term.set_cursor(1, s.height - 1);
|
||||
term.show_cursor();
|
||||
ColonPrompt::default()
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for ColonPrompt {
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
impl HandlesInput for ColonPrompt {
|
||||
fn handle_key(&mut self, term: TermType, evt: KeyEvent) -> Result<InputResult> {
|
||||
let KeyEvent { code, .. } = evt;
|
||||
match code {
|
||||
KeyCode::Esc => return Ok(InputResult::Pop),
|
||||
// KeyCode::Char('q') => return Ok(InputResult::Pop),
|
||||
KeyCode::Char(c) => {
|
||||
let mut b = [0; 2];
|
||||
self.value += c.encode_utf8(&mut b);
|
||||
}
|
||||
KeyCode::Backspace => {
|
||||
let mut new_len = self.value.len();
|
||||
if new_len > 0 {
|
||||
new_len -= 1;
|
||||
}
|
||||
self.value.truncate(new_len);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
Ok(InputResult::Ok)
|
||||
}
|
||||
}
|
54
src/ui/input.rs
Normal file
54
src/ui/input.rs
Normal file
|
@ -0,0 +1,54 @@
|
|||
use std::any::Any;
|
||||
use std::fmt::Debug;
|
||||
use std::sync::{
|
||||
atomic::{AtomicBool, Ordering},
|
||||
Arc,
|
||||
};
|
||||
|
||||
use anyhow::Result;
|
||||
use crossterm::event::{self, Event, KeyCode, KeyEvent};
|
||||
use downcast_rs::Downcast;
|
||||
|
||||
use super::colon_prompt::ColonPrompt;
|
||||
use super::TermType;
|
||||
|
||||
pub trait HandlesInput: Any + Debug + Downcast {
|
||||
fn handle_key(&mut self, term: TermType, evt: KeyEvent) -> Result<InputResult> {
|
||||
Ok(InputResult::Ok)
|
||||
}
|
||||
}
|
||||
|
||||
downcast_rs::impl_downcast!(HandlesInput);
|
||||
|
||||
pub enum InputResult {
|
||||
Ok,
|
||||
|
||||
/// Push a new state
|
||||
Push(Box<dyn HandlesInput>),
|
||||
|
||||
/// Pops a state from the stack
|
||||
Pop,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct BaseInputHandler(pub Arc<AtomicBool>);
|
||||
|
||||
impl HandlesInput for BaseInputHandler {
|
||||
fn handle_key(&mut self, term: TermType, evt: KeyEvent) -> Result<InputResult> {
|
||||
let KeyEvent { code, .. } = evt;
|
||||
match code {
|
||||
KeyCode::Char('q') => self.0.store(true, Ordering::Relaxed),
|
||||
KeyCode::Char(':') => {
|
||||
let colon_prompt = Box::new(ColonPrompt::init(term));
|
||||
return Ok(InputResult::Push(colon_prompt));
|
||||
// let rect = term.size()?;
|
||||
// term.set_cursor(1, rect.height - 1)?;
|
||||
// term.show_cursor()?;
|
||||
// colon_prompt = Some(ColonPrompt::default());
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
Ok(InputResult::Ok)
|
||||
}
|
||||
}
|
1
src/ui/keybinds.rs
Normal file
1
src/ui/keybinds.rs
Normal file
|
@ -0,0 +1 @@
|
|||
pub struct Keybinds {}
|
|
@ -1,9 +1,17 @@
|
|||
//! UI library
|
||||
|
||||
mod colon_prompt;
|
||||
mod input;
|
||||
mod keybinds;
|
||||
mod mail_tab;
|
||||
|
||||
use std::any::Any;
|
||||
use std::io::Stdout;
|
||||
use std::mem;
|
||||
use std::sync::{
|
||||
atomic::{AtomicBool, Ordering},
|
||||
Arc,
|
||||
};
|
||||
use std::time::Duration;
|
||||
|
||||
use anyhow::Result;
|
||||
|
@ -13,6 +21,7 @@ use crossterm::{
|
|||
event::{self, Event, KeyCode, KeyEvent},
|
||||
style, terminal,
|
||||
};
|
||||
use downcast_rs::Downcast;
|
||||
use futures::{future::FutureExt, select, stream::StreamExt};
|
||||
use panorama_imap::response::{AttributeValue, Envelope};
|
||||
use tokio::{sync::mpsc, time};
|
||||
|
@ -20,16 +29,19 @@ use tui::{
|
|||
backend::CrosstermBackend,
|
||||
layout::{Constraint, Direction, Layout},
|
||||
style::{Color, Modifier, Style},
|
||||
text::Spans,
|
||||
text::{Span, Spans},
|
||||
widgets::*,
|
||||
Frame, Terminal,
|
||||
};
|
||||
|
||||
use crate::mail::MailEvent;
|
||||
|
||||
use self::colon_prompt::ColonPrompt;
|
||||
use self::input::{BaseInputHandler, HandlesInput, InputResult};
|
||||
use self::mail_tab::{EmailMetadata, MailTabState};
|
||||
|
||||
pub(crate) type FrameType<'a, 'b> = Frame<'a, CrosstermBackend<&'b mut Stdout>>;
|
||||
pub(crate) type TermType<'a, 'b> = &'b mut Terminal<CrosstermBackend<&'a mut Stdout>>;
|
||||
|
||||
const FRAME_DURATION: Duration = Duration::from_millis(17);
|
||||
|
||||
|
@ -44,10 +56,14 @@ pub async fn run_ui(
|
|||
|
||||
let backend = CrosstermBackend::new(&mut stdout);
|
||||
let mut term = Terminal::new(backend)?;
|
||||
|
||||
let mut mail_tab = MailTabState::default();
|
||||
|
||||
loop {
|
||||
// state stack for handling inputs
|
||||
let should_exit = Arc::new(AtomicBool::new(false));
|
||||
let mut input_states: Vec<Box<dyn HandlesInput>> =
|
||||
vec![Box::new(BaseInputHandler(should_exit.clone()))];
|
||||
|
||||
while !should_exit.load(Ordering::Relaxed) {
|
||||
term.draw(|f| {
|
||||
let chunks = Layout::default()
|
||||
.direction(Direction::Vertical)
|
||||
|
@ -64,24 +80,70 @@ pub async fn run_ui(
|
|||
let tabs = Tabs::new(titles);
|
||||
f.render_widget(tabs, chunks[0]);
|
||||
|
||||
// this is the main mail tab
|
||||
mail_tab.render(f, chunks[1]);
|
||||
|
||||
// this is the status bar
|
||||
if let Some(last_state) = input_states.last() {
|
||||
let downcasted = last_state.downcast_ref::<ColonPrompt>();
|
||||
match downcasted {
|
||||
Some(colon_prompt) => {
|
||||
let status = Block::default().title(vec![
|
||||
Span::styled(":", Style::default().fg(Color::Gray)),
|
||||
Span::raw(&colon_prompt.value),
|
||||
]);
|
||||
f.render_widget(status, chunks[2]);
|
||||
f.set_cursor(colon_prompt.value.len() as u16 + 1, chunks[2].y);
|
||||
}
|
||||
None => {
|
||||
let status = Paragraph::new("hellosu");
|
||||
f.render_widget(status, chunks[2]);
|
||||
}
|
||||
};
|
||||
}
|
||||
})?;
|
||||
|
||||
let event = if event::poll(FRAME_DURATION)? {
|
||||
let event = event::read()?;
|
||||
// table.update(&event);
|
||||
|
||||
if let Event::Key(KeyEvent { code, .. }) = event {
|
||||
match code {
|
||||
KeyCode::Char('q') => break,
|
||||
KeyCode::Char('j') => mail_tab.move_down(),
|
||||
KeyCode::Char('k') => mail_tab.move_up(),
|
||||
_ => {}
|
||||
if let Event::Key(evt) = event {
|
||||
// handle states in the state stack
|
||||
// although this is written in a for loop, every case except one should break
|
||||
let mut should_pop = false;
|
||||
for input_state in input_states.iter_mut().rev() {
|
||||
match input_state.handle_key(&mut term, evt)? {
|
||||
InputResult::Ok => break,
|
||||
InputResult::Push(state) => {
|
||||
input_states.push(state);
|
||||
break;
|
||||
}
|
||||
InputResult::Pop => {
|
||||
should_pop = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if should_pop {
|
||||
input_states.pop();
|
||||
}
|
||||
}
|
||||
|
||||
// if let Event::Key(KeyEvent { code, .. }) = event {
|
||||
// match code {
|
||||
// // KeyCode::Char('q') => break,
|
||||
// KeyCode::Char('j') => mail_tab.move_down(),
|
||||
// KeyCode::Char('k') => mail_tab.move_up(),
|
||||
// KeyCode::Char(':') => {
|
||||
// let rect = term.size()?;
|
||||
// term.set_cursor(1, rect.height - 1)?;
|
||||
// term.show_cursor()?;
|
||||
// colon_prompt = Some(ColonPrompt::default());
|
||||
// }
|
||||
// _ => {}
|
||||
// }
|
||||
// }
|
||||
|
||||
Some(event)
|
||||
} else {
|
||||
|
@ -95,15 +157,9 @@ pub async fn run_ui(
|
|||
let mail_evt = mail_evt.unwrap();
|
||||
|
||||
match mail_evt {
|
||||
MailEvent::FolderList(new_folders) => {
|
||||
mail_tab.folders = new_folders;
|
||||
}
|
||||
MailEvent::MessageList(new_messages) => {
|
||||
mail_tab.messages = new_messages;
|
||||
}
|
||||
MailEvent::MessageUids(new_uids) => {
|
||||
mail_tab.message_uids = new_uids;
|
||||
}
|
||||
MailEvent::FolderList(new_folders) => mail_tab.folders = new_folders,
|
||||
MailEvent::MessageList(new_messages) => mail_tab.messages = new_messages,
|
||||
MailEvent::MessageUids(new_uids) => mail_tab.message_uids = new_uids,
|
||||
|
||||
MailEvent::UpdateUid(_, attrs) => {
|
||||
let mut uid = None;
|
||||
|
|
Loading…
Reference in a new issue