Prefer combinators to pattern matching, handle errors idiomatically
This commit is contained in:
parent
0be88732c6
commit
9b89311c44
|
@ -30,6 +30,110 @@ version = "0.8.7"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "97be891acc47ca214468e09425d02cef3af2c94d0d82081cd02061f996802f14"
|
||||
|
||||
[[package]]
|
||||
name = "async-channel"
|
||||
version = "1.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319"
|
||||
dependencies = [
|
||||
"concurrent-queue",
|
||||
"event-listener",
|
||||
"futures-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-executor"
|
||||
version = "1.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965"
|
||||
dependencies = [
|
||||
"async-task",
|
||||
"concurrent-queue",
|
||||
"fastrand",
|
||||
"futures-lite",
|
||||
"once_cell",
|
||||
"slab",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-fs"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8b3ca4f8ff117c37c278a2f7415ce9be55560b846b5bc4412aaa5d29c1c3dae2"
|
||||
dependencies = [
|
||||
"async-lock",
|
||||
"blocking",
|
||||
"futures-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-io"
|
||||
version = "1.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b"
|
||||
dependencies = [
|
||||
"concurrent-queue",
|
||||
"futures-lite",
|
||||
"libc",
|
||||
"log 0.4.14",
|
||||
"once_cell",
|
||||
"parking",
|
||||
"polling",
|
||||
"slab",
|
||||
"socket2",
|
||||
"waker-fn",
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-lock"
|
||||
version = "2.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b"
|
||||
dependencies = [
|
||||
"event-listener",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-net"
|
||||
version = "1.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5373304df79b9b4395068fb080369ec7178608827306ce4d081cba51cac551df"
|
||||
dependencies = [
|
||||
"async-io",
|
||||
"blocking",
|
||||
"futures-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-process"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a8f38756dd9ac84671c428afbf7c9f7495feff9ec5b0710f17100098e5b354ac"
|
||||
dependencies = [
|
||||
"async-io",
|
||||
"blocking",
|
||||
"cfg-if 1.0.0",
|
||||
"event-listener",
|
||||
"futures-lite",
|
||||
"libc",
|
||||
"once_cell",
|
||||
"signal-hook",
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-task"
|
||||
version = "4.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0"
|
||||
|
||||
[[package]]
|
||||
name = "atomic-waker"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "0.1.7"
|
||||
|
@ -115,6 +219,20 @@ dependencies = [
|
|||
"byte-tools",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "blocking"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c5e170dbede1f740736619b776d7251cb1b9095c435c34d8ca9f57fcd2f335e9"
|
||||
dependencies = [
|
||||
"async-channel",
|
||||
"async-task",
|
||||
"atomic-waker",
|
||||
"fastrand",
|
||||
"futures-lite",
|
||||
"once_cell",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "buf_redux"
|
||||
version = "0.8.4"
|
||||
|
@ -172,6 +290,12 @@ version = "1.0.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040"
|
||||
|
||||
[[package]]
|
||||
name = "cache-padded"
|
||||
version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
|
||||
|
||||
[[package]]
|
||||
name = "cargo-platform"
|
||||
version = "0.1.1"
|
||||
|
@ -247,6 +371,15 @@ dependencies = [
|
|||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "concurrent-queue"
|
||||
version = "1.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3"
|
||||
dependencies = [
|
||||
"cache-padded",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cookie"
|
||||
version = "0.12.0"
|
||||
|
@ -425,6 +558,12 @@ dependencies = [
|
|||
"version_check 0.9.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "event-listener"
|
||||
version = "2.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59"
|
||||
|
||||
[[package]]
|
||||
name = "failure"
|
||||
version = "0.1.8"
|
||||
|
@ -453,6 +592,15 @@ version = "0.1.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
|
||||
|
||||
[[package]]
|
||||
name = "fastrand"
|
||||
version = "1.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "77b705829d1e87f762c2df6da140b26af5839e1033aa84aa5f56bb688e4e1bdb"
|
||||
dependencies = [
|
||||
"instant",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "flate2"
|
||||
version = "1.0.20"
|
||||
|
@ -537,16 +685,131 @@ version = "0.1.31"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678"
|
||||
|
||||
[[package]]
|
||||
name = "futures"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27"
|
||||
dependencies = [
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-executor",
|
||||
"futures-io",
|
||||
"futures-sink",
|
||||
"futures-task",
|
||||
"futures-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-channel"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-core"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1"
|
||||
|
||||
[[package]]
|
||||
name = "futures-cpupool"
|
||||
version = "0.1.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
|
||||
dependencies = [
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"num_cpus",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-executor"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-task",
|
||||
"futures-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-io"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1"
|
||||
|
||||
[[package]]
|
||||
name = "futures-lite"
|
||||
version = "1.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48"
|
||||
dependencies = [
|
||||
"fastrand",
|
||||
"futures-core",
|
||||
"futures-io",
|
||||
"memchr",
|
||||
"parking",
|
||||
"pin-project-lite",
|
||||
"waker-fn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-macro"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121"
|
||||
dependencies = [
|
||||
"autocfg 1.0.1",
|
||||
"proc-macro-hack",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-sink"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282"
|
||||
|
||||
[[package]]
|
||||
name = "futures-task"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae"
|
||||
|
||||
[[package]]
|
||||
name = "futures-timer"
|
||||
version = "3.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
|
||||
|
||||
[[package]]
|
||||
name = "futures-util"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967"
|
||||
dependencies = [
|
||||
"autocfg 1.0.1",
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-io",
|
||||
"futures-macro",
|
||||
"futures-sink",
|
||||
"futures-task",
|
||||
"memchr",
|
||||
"pin-project-lite",
|
||||
"pin-utils",
|
||||
"proc-macro-hack",
|
||||
"proc-macro-nested",
|
||||
"slab",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "generic-array"
|
||||
version = "0.12.4"
|
||||
|
@ -605,7 +868,7 @@ dependencies = [
|
|||
"byteorder",
|
||||
"bytes 0.4.12",
|
||||
"fnv",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"http 0.1.21",
|
||||
"indexmap",
|
||||
"log 0.4.14",
|
||||
|
@ -658,7 +921,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d"
|
||||
dependencies = [
|
||||
"bytes 0.4.12",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"http 0.1.21",
|
||||
"tokio-buf",
|
||||
]
|
||||
|
@ -695,7 +958,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52"
|
||||
dependencies = [
|
||||
"bytes 0.4.12",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"futures-cpupool",
|
||||
"h2",
|
||||
"http 0.1.21",
|
||||
|
@ -742,7 +1005,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f"
|
||||
dependencies = [
|
||||
"bytes 0.4.12",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"hyper 0.12.36",
|
||||
"native-tls",
|
||||
"tokio-io",
|
||||
|
@ -789,6 +1052,15 @@ dependencies = [
|
|||
"bytes 0.5.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "instant"
|
||||
version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iovec"
|
||||
version = "0.1.4"
|
||||
|
@ -838,9 +1110,12 @@ dependencies = [
|
|||
"chrono",
|
||||
"elefren",
|
||||
"frankenstein",
|
||||
"futures 0.3.15",
|
||||
"futures-timer",
|
||||
"rand 0.8.4",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"smol",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1183,6 +1458,12 @@ dependencies = [
|
|||
"vcpkg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.9.0"
|
||||
|
@ -1269,6 +1550,18 @@ dependencies = [
|
|||
"unicase 1.4.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.2.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443"
|
||||
|
||||
[[package]]
|
||||
name = "pin-utils"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
||||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.19"
|
||||
|
@ -1284,12 +1577,37 @@ dependencies = [
|
|||
"typemap",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "polling"
|
||||
version = "2.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"libc",
|
||||
"log 0.4.14",
|
||||
"wepoll-ffi",
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-hack"
|
||||
version = "0.5.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-nested"
|
||||
version = "0.1.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.27"
|
||||
|
@ -1584,7 +1902,7 @@ dependencies = [
|
|||
"cookie_store",
|
||||
"encoding_rs",
|
||||
"flate2",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"http 0.1.21",
|
||||
"hyper 0.12.36",
|
||||
"hyper-tls",
|
||||
|
@ -1832,6 +2150,25 @@ dependencies = [
|
|||
"opaque-debug",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "470c5a6397076fae0094aaf06a08e6ba6f37acb77d3b1b91ea92b4d6c8650c39"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"signal-hook-registry",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-registry"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "siphasher"
|
||||
version = "0.2.3"
|
||||
|
@ -1868,6 +2205,34 @@ dependencies = [
|
|||
"maybe-uninit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "smol"
|
||||
version = "1.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85cf3b5351f3e783c1d79ab5fc604eeed8b8ae9abd36b166e8b87a089efd85e4"
|
||||
dependencies = [
|
||||
"async-channel",
|
||||
"async-executor",
|
||||
"async-fs",
|
||||
"async-io",
|
||||
"async-lock",
|
||||
"async-net",
|
||||
"async-process",
|
||||
"blocking",
|
||||
"futures-lite",
|
||||
"once_cell",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "socket2"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.5.2"
|
||||
|
@ -1971,7 +2336,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6"
|
||||
dependencies = [
|
||||
"bytes 0.4.12",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"mio",
|
||||
"num_cpus",
|
||||
"tokio-current-thread",
|
||||
|
@ -1991,7 +2356,7 @@ checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46"
|
|||
dependencies = [
|
||||
"bytes 0.4.12",
|
||||
"either",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -2000,7 +2365,7 @@ version = "0.1.7"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e"
|
||||
dependencies = [
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"tokio-executor",
|
||||
]
|
||||
|
||||
|
@ -2011,7 +2376,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -2021,7 +2386,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674"
|
||||
dependencies = [
|
||||
"bytes 0.4.12",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"log 0.4.14",
|
||||
]
|
||||
|
||||
|
@ -2032,7 +2397,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"lazy_static",
|
||||
"log 0.4.14",
|
||||
"mio",
|
||||
|
@ -2051,7 +2416,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee"
|
||||
dependencies = [
|
||||
"fnv",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -2061,7 +2426,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72"
|
||||
dependencies = [
|
||||
"bytes 0.4.12",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"iovec",
|
||||
"mio",
|
||||
"tokio-io",
|
||||
|
@ -2077,7 +2442,7 @@ dependencies = [
|
|||
"crossbeam-deque",
|
||||
"crossbeam-queue",
|
||||
"crossbeam-utils",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"lazy_static",
|
||||
"log 0.4.14",
|
||||
"num_cpus",
|
||||
|
@ -2092,7 +2457,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"slab",
|
||||
"tokio-executor",
|
||||
]
|
||||
|
@ -2312,6 +2677,12 @@ version = "0.9.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
|
||||
|
||||
[[package]]
|
||||
name = "waker-fn"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
|
||||
|
||||
[[package]]
|
||||
name = "walkdir"
|
||||
version = "2.3.2"
|
||||
|
@ -2329,7 +2700,7 @@ version = "0.2.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230"
|
||||
dependencies = [
|
||||
"futures",
|
||||
"futures 0.1.31",
|
||||
"log 0.4.14",
|
||||
"try-lock",
|
||||
]
|
||||
|
@ -2429,6 +2800,15 @@ dependencies = [
|
|||
"webpki",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wepoll-ffi"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb"
|
||||
dependencies = [
|
||||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.2.8"
|
||||
|
|
|
@ -10,6 +10,9 @@ edition = "2018"
|
|||
chrono = "0.4.19"
|
||||
elefren = { version = "0.22.0", features = ["toml"] }
|
||||
frankenstein = "0.4.0"
|
||||
futures = "0.3.15"
|
||||
futures-timer = "3.0.2"
|
||||
rand = "0.8.4"
|
||||
serde = "1.0.126"
|
||||
serde_json = "1.0.64"
|
||||
smol = "1.2.5"
|
||||
|
|
34
src/bot.rs
34
src/bot.rs
|
@ -1,10 +1,7 @@
|
|||
use rand::Rng;
|
||||
use std::{error::Error, io};
|
||||
use std::error::Error;
|
||||
|
||||
use crate::{
|
||||
generator, model, publish,
|
||||
selection::{self, Selector},
|
||||
};
|
||||
use crate::{generator, model, publish, selection};
|
||||
|
||||
pub struct IzzilisBot<T: model::SampleModel, U: publish::Publisher, V: selection::Selector> {
|
||||
generator: generator::Generator<T>,
|
||||
|
@ -32,25 +29,18 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
pub fn generate_samples(&mut self) -> Option<io::Error> {
|
||||
let lines_result = self.generator.generate_sample_lines();
|
||||
let lines = match lines_result {
|
||||
Ok(res) => res,
|
||||
Err(err) => return Some(err),
|
||||
};
|
||||
pub fn generate_samples(&mut self) -> Result<(), Box<dyn Error>> {
|
||||
let lines = self.generator.generate_sample_lines()?;
|
||||
for line in lines {
|
||||
match self.selector.send_for_review(line) {
|
||||
Some(err) => panic!("Failed selector read, yes shit error I know, help me"), // Yes, I know this is *abysmal* but idk how to deal with errors
|
||||
// yet, so for the time being I have to suffer through this bad shit. Please help me, looking at this is suffering. I want it to end.
|
||||
None => (),
|
||||
}
|
||||
self.selector.send_for_review(line)?;
|
||||
}
|
||||
|
||||
self.loaded_samples = self.selector.collect_selected_samples(); // wtf happens to the original self.loaded_samples???????
|
||||
|
||||
None
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn publish(&mut self) -> Option<Box<dyn Error>> {
|
||||
pub fn publish(&mut self) -> Result<(), U::Error> {
|
||||
if self.loaded_samples.len() == 0 {
|
||||
// Refresh samples. Either none have been generated so far,
|
||||
// or generated ones are stale.
|
||||
|
@ -58,16 +48,14 @@ where
|
|||
// This is a shit solution, but I'm going with it for v1
|
||||
// purely because I don't know the language well enough to be
|
||||
// confident in doing this via threads. Yet.
|
||||
self.generate_samples();
|
||||
// TODO handle errors here
|
||||
let _ = self.generate_samples();
|
||||
}
|
||||
let sample_index = rand::thread_rng().gen_range(0..self.loaded_samples.len() - 1);
|
||||
let content = self.loaded_samples[sample_index].clone();
|
||||
self.loaded_samples.remove(sample_index);
|
||||
|
||||
match self.publisher.publish(content) {
|
||||
Some(err) => Some(err),
|
||||
None => None,
|
||||
}
|
||||
self.publisher.publish(content)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -18,15 +18,13 @@ where
|
|||
}
|
||||
|
||||
pub fn generate_sample_lines(&self) -> Result<Vec<String>, io::Error> {
|
||||
let unwashed_sample = self.model.get_sample()?;
|
||||
// Cursed, I just wanted a Select
|
||||
let mut washed_sample: Vec<String> = Vec::new();
|
||||
unwashed_sample
|
||||
Ok(self
|
||||
.model
|
||||
.get_sample()?
|
||||
.replace(SAMPLE_SAMPLE_LINE, "")
|
||||
.split(SAMPLE_SPLIT_WORD)
|
||||
.into_iter()
|
||||
.for_each(|elem| washed_sample.push(elem.trim().to_string()));
|
||||
|
||||
Ok(washed_sample)
|
||||
.map(|elem| elem.trim().to_owned())
|
||||
.collect::<Vec<_>>())
|
||||
}
|
||||
}
|
||||
|
|
96
src/main.rs
96
src/main.rs
|
@ -1,4 +1,4 @@
|
|||
use std::{error::Error, process, thread, time::Duration};
|
||||
use std::{error::Error, process, time::Duration};
|
||||
|
||||
use chrono::Local;
|
||||
use rand::Rng;
|
||||
|
@ -7,6 +7,8 @@ use crate::{
|
|||
bot::IzzilisBot, generator::Generator, publish::FediversePublisher, selection::ConsoleSelector,
|
||||
};
|
||||
|
||||
use futures_timer::Delay;
|
||||
|
||||
mod bot;
|
||||
mod config;
|
||||
mod generator;
|
||||
|
@ -17,53 +19,55 @@ mod selection;
|
|||
const CONFIG_PATH: &str = "bot_config.json";
|
||||
|
||||
fn main() -> Result<(), Box<dyn Error>> {
|
||||
let cfg = match config::Config::from(CONFIG_PATH.to_string()) {
|
||||
Ok(cfg) => cfg,
|
||||
Err(_) => {
|
||||
println!(
|
||||
"Failed reading config at [{}], writing default",
|
||||
CONFIG_PATH
|
||||
);
|
||||
match config::Config::default().save(CONFIG_PATH.to_string()) {
|
||||
Some(err) => println!("Failed writing file to {}: {}", CONFIG_PATH, err),
|
||||
None => (),
|
||||
smol::block_on(async {
|
||||
let cfg = match config::Config::from(CONFIG_PATH.to_string()) {
|
||||
Ok(cfg) => cfg,
|
||||
Err(_) => {
|
||||
println!(
|
||||
"Failed reading config at [{}], writing default",
|
||||
CONFIG_PATH
|
||||
);
|
||||
match config::Config::default().save(CONFIG_PATH.to_string()) {
|
||||
Some(err) => println!("Failed writing file to {}: {}", CONFIG_PATH, err),
|
||||
None => (),
|
||||
}
|
||||
process::exit(1);
|
||||
}
|
||||
process::exit(1);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
let gpt_model = model::GPTSampleModel::new(
|
||||
cfg.python_path(),
|
||||
cfg.gpt_code_path(),
|
||||
vec![
|
||||
"generate_unconditional_samples.py".to_string(),
|
||||
"--model_name".to_string(),
|
||||
cfg.model_name(),
|
||||
"--temperature".to_string(),
|
||||
cfg.temperature(),
|
||||
"--top_k".to_string(),
|
||||
cfg.top_k(),
|
||||
"--nsamples".to_string(),
|
||||
"1".to_string(),
|
||||
],
|
||||
);
|
||||
let publisher = FediversePublisher::new(cfg.fediverse_base_url())?;
|
||||
// let publisher = ConsolePublisher::new();
|
||||
let gen = Generator::new(gpt_model);
|
||||
let console_selector = ConsoleSelector::new();
|
||||
let mut bot = IzzilisBot::new(gen, publisher, console_selector);
|
||||
bot.generate_samples();
|
||||
let gpt_model = model::GPTSampleModel::new(
|
||||
cfg.python_path(),
|
||||
cfg.gpt_code_path(),
|
||||
vec![
|
||||
"generate_unconditional_samples.py".to_string(),
|
||||
"--model_name".to_string(),
|
||||
cfg.model_name(),
|
||||
"--temperature".to_string(),
|
||||
cfg.temperature(),
|
||||
"--top_k".to_string(),
|
||||
cfg.top_k(),
|
||||
"--nsamples".to_string(),
|
||||
"1".to_string(),
|
||||
],
|
||||
);
|
||||
let publisher = FediversePublisher::new(cfg.fediverse_base_url())?;
|
||||
// let publisher = ConsolePublisher::new();
|
||||
let gen = Generator::new(gpt_model);
|
||||
let console_selector = ConsoleSelector::new();
|
||||
let mut bot = IzzilisBot::new(gen, publisher, console_selector);
|
||||
bot.generate_samples();
|
||||
|
||||
let cfg_interval = cfg.interval_seconds();
|
||||
loop {
|
||||
let wait_seconds = rand::thread_rng().gen_range(cfg_interval.min()..cfg_interval.max());
|
||||
let wait_time = Duration::from_secs(wait_seconds);
|
||||
let now = Local::now();
|
||||
println!("[{}] Next post is in [{}] seconds", now, wait_seconds);
|
||||
thread::sleep(wait_time);
|
||||
match bot.publish() {
|
||||
Some(err) => println!("Got error from publish: [{}]; continuing", err),
|
||||
None => println!("publish() call successful"),
|
||||
let cfg_interval = cfg.interval_seconds();
|
||||
loop {
|
||||
let wait_seconds = rand::thread_rng().gen_range(cfg_interval.min()..cfg_interval.max());
|
||||
let wait_time = Duration::from_secs(wait_seconds);
|
||||
let now = Local::now();
|
||||
println!("[{}] Next post is in [{}] seconds", now, wait_seconds);
|
||||
Delay::new(wait_time).await;
|
||||
match bot.publish() {
|
||||
Err(err) => println!("Got error from publish: [{}]; continuing", err),
|
||||
Ok(()) => println!("publish() call successful"),
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use std::error::Error;
|
||||
use std::{convert::Infallible, error::Error};
|
||||
|
||||
use elefren::{
|
||||
helpers::{cli, toml},
|
||||
|
@ -10,7 +10,9 @@ use elefren::{
|
|||
const FEDIVERSE_TOML_PATH: &str = "fediverse.toml";
|
||||
|
||||
pub trait Publisher {
|
||||
fn publish(&self, content: String) -> Option<Box<dyn Error>>;
|
||||
type Error;
|
||||
|
||||
fn publish(&self, content: String) -> Result<(), Self::Error>;
|
||||
}
|
||||
|
||||
pub struct FediversePublisher {
|
||||
|
@ -20,9 +22,11 @@ pub struct FediversePublisher {
|
|||
pub struct ConsolePublisher;
|
||||
|
||||
impl Publisher for ConsolePublisher {
|
||||
fn publish(&self, content: String) -> Option<Box<dyn Error>> {
|
||||
type Error = Infallible;
|
||||
|
||||
fn publish(&self, content: String) -> Result<(), Self::Error> {
|
||||
println!("Publishing content to stdout: {}", content);
|
||||
None
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -34,35 +38,34 @@ impl ConsolePublisher {
|
|||
|
||||
impl FediversePublisher {
|
||||
pub fn new(fedi_url: String) -> Result<FediversePublisher, Box<dyn Error>> {
|
||||
let fedi = if let Ok(data) = toml::from_file(FEDIVERSE_TOML_PATH.to_string()) {
|
||||
Mastodon::from(data)
|
||||
} else {
|
||||
register(fedi_url)?
|
||||
};
|
||||
Ok(Self { client: fedi })
|
||||
Ok(Self {
|
||||
client: toml::from_file(FEDIVERSE_TOML_PATH)
|
||||
.map(|data| Ok(Mastodon::from(data)))
|
||||
.unwrap_or_else(|_| register(fedi_url))?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl Publisher for FediversePublisher {
|
||||
fn publish(&self, content: String) -> Option<Box<dyn Error>> {
|
||||
let status_build_result = StatusBuilder::new()
|
||||
type Error = Box<dyn Error>;
|
||||
|
||||
fn publish(&self, content: String) -> Result<(), Self::Error> {
|
||||
let status = StatusBuilder::new()
|
||||
.status(&content)
|
||||
// .visibility(Visibility::Direct)
|
||||
.visibility(Visibility::Public)
|
||||
.sensitive(false)
|
||||
.language(Language::Eng)
|
||||
.build();
|
||||
.build()
|
||||
.map_err(|e| Box::new(e) as Box<dyn Error>)?;
|
||||
|
||||
let status = match status_build_result {
|
||||
Ok(status) => status,
|
||||
Err(err) => return Some(Box::new(err)),
|
||||
};
|
||||
println!("Posting status [{}] to fediverse", &content);
|
||||
|
||||
match self.client.new_status(status) {
|
||||
Ok(_) => None,
|
||||
Err(err) => Some(Box::new(err)),
|
||||
}
|
||||
self.client
|
||||
.new_status(status)
|
||||
.map_err(|e| Box::new(e) as Box<dyn Error>)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,13 +1,21 @@
|
|||
use frankenstein::{
|
||||
Api, GetUpdatesParams, KeyboardButton, ReplyKeyboardMarkup, ReplyMarkup, TelegramApi,
|
||||
};
|
||||
use futures::Future;
|
||||
use std::{error::Error, io, thread::JoinHandle};
|
||||
|
||||
pub trait Selector {
|
||||
fn send_for_review(&mut self, message: String) -> Option<Box<dyn Error>>;
|
||||
fn send_for_review(&mut self, message: String) -> Result<(), Box<dyn Error>>;
|
||||
fn collect_selected_samples(&mut self) -> Vec<String>;
|
||||
}
|
||||
|
||||
// pub trait Selector {
|
||||
// type Error;
|
||||
// type Response: Future<Output = Result<bool, Self::Error>>;
|
||||
|
||||
// fn review(self, data: String) -> Self::Response;
|
||||
// }
|
||||
|
||||
pub struct TelegramSelector {
|
||||
client: frankenstein::Api,
|
||||
dest_chat_id: String,
|
||||
|
@ -19,7 +27,7 @@ pub struct ConsoleSelector {
|
|||
}
|
||||
|
||||
impl Selector for ConsoleSelector {
|
||||
fn send_for_review(&mut self, message: String) -> Option<Box<dyn Error>> {
|
||||
fn send_for_review(&mut self, message: String) -> Result<(), Box<dyn Error>> {
|
||||
println!("generated sample [y+enter to accept]: {}", &message);
|
||||
let mut choice = String::new();
|
||||
io::stdin().read_line(&mut choice).expect("cum");
|
||||
|
@ -27,7 +35,7 @@ impl Selector for ConsoleSelector {
|
|||
println!("accepted");
|
||||
self.selected_samples.push(message);
|
||||
}
|
||||
return None;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn collect_selected_samples(&mut self) -> Vec<String> {
|
||||
|
@ -49,7 +57,7 @@ const KEEP_BUTTON: &str = "Keep";
|
|||
const TOSS_BUTTON: &str = "Toss";
|
||||
|
||||
impl Selector for TelegramSelector {
|
||||
fn send_for_review(&mut self, message: String) -> Option<Box<dyn Error>> {
|
||||
fn send_for_review(&mut self, message: String) -> Result<(), Box<dyn Error>> {
|
||||
todo!();
|
||||
if !self.listener_handle.is_none() {
|
||||
todo!();
|
||||
|
@ -64,12 +72,12 @@ impl Selector for TelegramSelector {
|
|||
KeyboardButton::new(TOSS_BUTTON.to_string()),
|
||||
]),
|
||||
));
|
||||
let result = match self.client.send_message(&message_def) {
|
||||
Ok(_) => None,
|
||||
Err(_) => todo!(),
|
||||
};
|
||||
|
||||
result
|
||||
self.client
|
||||
.send_message(&message_def)
|
||||
.expect("TODO handle this properly (doesn't implement std error for some reason)");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn collect_selected_samples(&mut self) -> Vec<String> {
|
||||
|
|
Loading…
Reference in New Issue