Prefer combinators to pattern matching, handle errors idiomatically

This commit is contained in:
Izzy Swart 2021-07-03 17:21:54 -07:00
parent 0be88732c6
commit 9b89311c44
7 changed files with 507 additions and 123 deletions

414
Cargo.lock generated
View File

@ -30,6 +30,110 @@ version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97be891acc47ca214468e09425d02cef3af2c94d0d82081cd02061f996802f14" 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]] [[package]]
name = "autocfg" name = "autocfg"
version = "0.1.7" version = "0.1.7"
@ -115,6 +219,20 @@ dependencies = [
"byte-tools", "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]] [[package]]
name = "buf_redux" name = "buf_redux"
version = "0.8.4" version = "0.8.4"
@ -172,6 +290,12 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040"
[[package]]
name = "cache-padded"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
[[package]] [[package]]
name = "cargo-platform" name = "cargo-platform"
version = "0.1.1" version = "0.1.1"
@ -247,6 +371,15 @@ dependencies = [
"bitflags", "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]] [[package]]
name = "cookie" name = "cookie"
version = "0.12.0" version = "0.12.0"
@ -425,6 +558,12 @@ dependencies = [
"version_check 0.9.3", "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]] [[package]]
name = "failure" name = "failure"
version = "0.1.8" version = "0.1.8"
@ -453,6 +592,15 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
[[package]]
name = "fastrand"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77b705829d1e87f762c2df6da140b26af5839e1033aa84aa5f56bb688e4e1bdb"
dependencies = [
"instant",
]
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.20" version = "1.0.20"
@ -537,16 +685,131 @@ version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" 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]] [[package]]
name = "futures-cpupool" name = "futures-cpupool"
version = "0.1.8" version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
dependencies = [ dependencies = [
"futures", "futures 0.1.31",
"num_cpus", "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]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.12.4" version = "0.12.4"
@ -605,7 +868,7 @@ dependencies = [
"byteorder", "byteorder",
"bytes 0.4.12", "bytes 0.4.12",
"fnv", "fnv",
"futures", "futures 0.1.31",
"http 0.1.21", "http 0.1.21",
"indexmap", "indexmap",
"log 0.4.14", "log 0.4.14",
@ -658,7 +921,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d"
dependencies = [ dependencies = [
"bytes 0.4.12", "bytes 0.4.12",
"futures", "futures 0.1.31",
"http 0.1.21", "http 0.1.21",
"tokio-buf", "tokio-buf",
] ]
@ -695,7 +958,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52" checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52"
dependencies = [ dependencies = [
"bytes 0.4.12", "bytes 0.4.12",
"futures", "futures 0.1.31",
"futures-cpupool", "futures-cpupool",
"h2", "h2",
"http 0.1.21", "http 0.1.21",
@ -742,7 +1005,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f"
dependencies = [ dependencies = [
"bytes 0.4.12", "bytes 0.4.12",
"futures", "futures 0.1.31",
"hyper 0.12.36", "hyper 0.12.36",
"native-tls", "native-tls",
"tokio-io", "tokio-io",
@ -789,6 +1052,15 @@ dependencies = [
"bytes 0.5.6", "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]] [[package]]
name = "iovec" name = "iovec"
version = "0.1.4" version = "0.1.4"
@ -838,9 +1110,12 @@ dependencies = [
"chrono", "chrono",
"elefren", "elefren",
"frankenstein", "frankenstein",
"futures 0.3.15",
"futures-timer",
"rand 0.8.4", "rand 0.8.4",
"serde", "serde",
"serde_json", "serde_json",
"smol",
] ]
[[package]] [[package]]
@ -1183,6 +1458,12 @@ dependencies = [
"vcpkg", "vcpkg",
] ]
[[package]]
name = "parking"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.9.0" version = "0.9.0"
@ -1269,6 +1550,18 @@ dependencies = [
"unicase 1.4.2", "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]] [[package]]
name = "pkg-config" name = "pkg-config"
version = "0.3.19" version = "0.3.19"
@ -1284,12 +1577,37 @@ dependencies = [
"typemap", "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]] [[package]]
name = "ppv-lite86" name = "ppv-lite86"
version = "0.2.10" version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" 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]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.27" version = "1.0.27"
@ -1584,7 +1902,7 @@ dependencies = [
"cookie_store", "cookie_store",
"encoding_rs", "encoding_rs",
"flate2", "flate2",
"futures", "futures 0.1.31",
"http 0.1.21", "http 0.1.21",
"hyper 0.12.36", "hyper 0.12.36",
"hyper-tls", "hyper-tls",
@ -1832,6 +2150,25 @@ dependencies = [
"opaque-debug", "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]] [[package]]
name = "siphasher" name = "siphasher"
version = "0.2.3" version = "0.2.3"
@ -1868,6 +2205,34 @@ dependencies = [
"maybe-uninit", "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]] [[package]]
name = "spin" name = "spin"
version = "0.5.2" version = "0.5.2"
@ -1971,7 +2336,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6"
dependencies = [ dependencies = [
"bytes 0.4.12", "bytes 0.4.12",
"futures", "futures 0.1.31",
"mio", "mio",
"num_cpus", "num_cpus",
"tokio-current-thread", "tokio-current-thread",
@ -1991,7 +2356,7 @@ checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46"
dependencies = [ dependencies = [
"bytes 0.4.12", "bytes 0.4.12",
"either", "either",
"futures", "futures 0.1.31",
] ]
[[package]] [[package]]
@ -2000,7 +2365,7 @@ version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e"
dependencies = [ dependencies = [
"futures", "futures 0.1.31",
"tokio-executor", "tokio-executor",
] ]
@ -2011,7 +2376,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671"
dependencies = [ dependencies = [
"crossbeam-utils", "crossbeam-utils",
"futures", "futures 0.1.31",
] ]
[[package]] [[package]]
@ -2021,7 +2386,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674"
dependencies = [ dependencies = [
"bytes 0.4.12", "bytes 0.4.12",
"futures", "futures 0.1.31",
"log 0.4.14", "log 0.4.14",
] ]
@ -2032,7 +2397,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351"
dependencies = [ dependencies = [
"crossbeam-utils", "crossbeam-utils",
"futures", "futures 0.1.31",
"lazy_static", "lazy_static",
"log 0.4.14", "log 0.4.14",
"mio", "mio",
@ -2051,7 +2416,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee"
dependencies = [ dependencies = [
"fnv", "fnv",
"futures", "futures 0.1.31",
] ]
[[package]] [[package]]
@ -2061,7 +2426,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72"
dependencies = [ dependencies = [
"bytes 0.4.12", "bytes 0.4.12",
"futures", "futures 0.1.31",
"iovec", "iovec",
"mio", "mio",
"tokio-io", "tokio-io",
@ -2077,7 +2442,7 @@ dependencies = [
"crossbeam-deque", "crossbeam-deque",
"crossbeam-queue", "crossbeam-queue",
"crossbeam-utils", "crossbeam-utils",
"futures", "futures 0.1.31",
"lazy_static", "lazy_static",
"log 0.4.14", "log 0.4.14",
"num_cpus", "num_cpus",
@ -2092,7 +2457,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296"
dependencies = [ dependencies = [
"crossbeam-utils", "crossbeam-utils",
"futures", "futures 0.1.31",
"slab", "slab",
"tokio-executor", "tokio-executor",
] ]
@ -2312,6 +2677,12 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
[[package]]
name = "waker-fn"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
[[package]] [[package]]
name = "walkdir" name = "walkdir"
version = "2.3.2" version = "2.3.2"
@ -2329,7 +2700,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230"
dependencies = [ dependencies = [
"futures", "futures 0.1.31",
"log 0.4.14", "log 0.4.14",
"try-lock", "try-lock",
] ]
@ -2429,6 +2800,15 @@ dependencies = [
"webpki", "webpki",
] ]
[[package]]
name = "wepoll-ffi"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb"
dependencies = [
"cc",
]
[[package]] [[package]]
name = "winapi" name = "winapi"
version = "0.2.8" version = "0.2.8"

View File

@ -10,6 +10,9 @@ edition = "2018"
chrono = "0.4.19" chrono = "0.4.19"
elefren = { version = "0.22.0", features = ["toml"] } elefren = { version = "0.22.0", features = ["toml"] }
frankenstein = "0.4.0" frankenstein = "0.4.0"
futures = "0.3.15"
futures-timer = "3.0.2"
rand = "0.8.4" rand = "0.8.4"
serde = "1.0.126" serde = "1.0.126"
serde_json = "1.0.64" serde_json = "1.0.64"
smol = "1.2.5"

View File

@ -1,10 +1,7 @@
use rand::Rng; use rand::Rng;
use std::{error::Error, io}; use std::error::Error;
use crate::{ use crate::{generator, model, publish, selection};
generator, model, publish,
selection::{self, Selector},
};
pub struct IzzilisBot<T: model::SampleModel, U: publish::Publisher, V: selection::Selector> { pub struct IzzilisBot<T: model::SampleModel, U: publish::Publisher, V: selection::Selector> {
generator: generator::Generator<T>, generator: generator::Generator<T>,
@ -32,25 +29,18 @@ where
} }
} }
pub fn generate_samples(&mut self) -> Option<io::Error> { pub fn generate_samples(&mut self) -> Result<(), Box<dyn Error>> {
let lines_result = self.generator.generate_sample_lines(); let lines = self.generator.generate_sample_lines()?;
let lines = match lines_result {
Ok(res) => res,
Err(err) => return Some(err),
};
for line in lines { for line in lines {
match self.selector.send_for_review(line) { 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.loaded_samples = self.selector.collect_selected_samples(); // wtf happens to the original self.loaded_samples??????? 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 { if self.loaded_samples.len() == 0 {
// Refresh samples. Either none have been generated so far, // Refresh samples. Either none have been generated so far,
// or generated ones are stale. // or generated ones are stale.
@ -58,16 +48,14 @@ where
// This is a shit solution, but I'm going with it for v1 // 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 // purely because I don't know the language well enough to be
// confident in doing this via threads. Yet. // 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 sample_index = rand::thread_rng().gen_range(0..self.loaded_samples.len() - 1);
let content = self.loaded_samples[sample_index].clone(); let content = self.loaded_samples[sample_index].clone();
self.loaded_samples.remove(sample_index); self.loaded_samples.remove(sample_index);
match self.publisher.publish(content) { self.publisher.publish(content)
Some(err) => Some(err),
None => None,
}
} }
} }

View File

@ -18,15 +18,13 @@ where
} }
pub fn generate_sample_lines(&self) -> Result<Vec<String>, io::Error> { pub fn generate_sample_lines(&self) -> Result<Vec<String>, io::Error> {
let unwashed_sample = self.model.get_sample()?; Ok(self
// Cursed, I just wanted a Select .model
let mut washed_sample: Vec<String> = Vec::new(); .get_sample()?
unwashed_sample
.replace(SAMPLE_SAMPLE_LINE, "") .replace(SAMPLE_SAMPLE_LINE, "")
.split(SAMPLE_SPLIT_WORD) .split(SAMPLE_SPLIT_WORD)
.into_iter() .into_iter()
.for_each(|elem| washed_sample.push(elem.trim().to_string())); .map(|elem| elem.trim().to_owned())
.collect::<Vec<_>>())
Ok(washed_sample)
} }
} }

View File

@ -1,4 +1,4 @@
use std::{error::Error, process, thread, time::Duration}; use std::{error::Error, process, time::Duration};
use chrono::Local; use chrono::Local;
use rand::Rng; use rand::Rng;
@ -7,6 +7,8 @@ use crate::{
bot::IzzilisBot, generator::Generator, publish::FediversePublisher, selection::ConsoleSelector, bot::IzzilisBot, generator::Generator, publish::FediversePublisher, selection::ConsoleSelector,
}; };
use futures_timer::Delay;
mod bot; mod bot;
mod config; mod config;
mod generator; mod generator;
@ -17,6 +19,7 @@ mod selection;
const CONFIG_PATH: &str = "bot_config.json"; const CONFIG_PATH: &str = "bot_config.json";
fn main() -> Result<(), Box<dyn Error>> { fn main() -> Result<(), Box<dyn Error>> {
smol::block_on(async {
let cfg = match config::Config::from(CONFIG_PATH.to_string()) { let cfg = match config::Config::from(CONFIG_PATH.to_string()) {
Ok(cfg) => cfg, Ok(cfg) => cfg,
Err(_) => { Err(_) => {
@ -60,10 +63,11 @@ fn main() -> Result<(), Box<dyn Error>> {
let wait_time = Duration::from_secs(wait_seconds); let wait_time = Duration::from_secs(wait_seconds);
let now = Local::now(); let now = Local::now();
println!("[{}] Next post is in [{}] seconds", now, wait_seconds); println!("[{}] Next post is in [{}] seconds", now, wait_seconds);
thread::sleep(wait_time); Delay::new(wait_time).await;
match bot.publish() { match bot.publish() {
Some(err) => println!("Got error from publish: [{}]; continuing", err), Err(err) => println!("Got error from publish: [{}]; continuing", err),
None => println!("publish() call successful"), Ok(()) => println!("publish() call successful"),
} }
} }
})
} }

View File

@ -1,4 +1,4 @@
use std::error::Error; use std::{convert::Infallible, error::Error};
use elefren::{ use elefren::{
helpers::{cli, toml}, helpers::{cli, toml},
@ -10,7 +10,9 @@ use elefren::{
const FEDIVERSE_TOML_PATH: &str = "fediverse.toml"; const FEDIVERSE_TOML_PATH: &str = "fediverse.toml";
pub trait Publisher { 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 { pub struct FediversePublisher {
@ -20,9 +22,11 @@ pub struct FediversePublisher {
pub struct ConsolePublisher; pub struct ConsolePublisher;
impl Publisher for 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); println!("Publishing content to stdout: {}", content);
None Ok(())
} }
} }
@ -34,35 +38,34 @@ impl ConsolePublisher {
impl FediversePublisher { impl FediversePublisher {
pub fn new(fedi_url: String) -> Result<FediversePublisher, Box<dyn Error>> { 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()) { Ok(Self {
Mastodon::from(data) client: toml::from_file(FEDIVERSE_TOML_PATH)
} else { .map(|data| Ok(Mastodon::from(data)))
register(fedi_url)? .unwrap_or_else(|_| register(fedi_url))?,
}; })
Ok(Self { client: fedi })
} }
} }
impl Publisher for FediversePublisher { impl Publisher for FediversePublisher {
fn publish(&self, content: String) -> Option<Box<dyn Error>> { type Error = Box<dyn Error>;
let status_build_result = StatusBuilder::new()
fn publish(&self, content: String) -> Result<(), Self::Error> {
let status = StatusBuilder::new()
.status(&content) .status(&content)
// .visibility(Visibility::Direct) // .visibility(Visibility::Direct)
.visibility(Visibility::Public) .visibility(Visibility::Public)
.sensitive(false) .sensitive(false)
.language(Language::Eng) .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); println!("Posting status [{}] to fediverse", &content);
match self.client.new_status(status) { self.client
Ok(_) => None, .new_status(status)
Err(err) => Some(Box::new(err)), .map_err(|e| Box::new(e) as Box<dyn Error>)?;
}
Ok(())
} }
} }

View File

@ -1,13 +1,21 @@
use frankenstein::{ use frankenstein::{
Api, GetUpdatesParams, KeyboardButton, ReplyKeyboardMarkup, ReplyMarkup, TelegramApi, Api, GetUpdatesParams, KeyboardButton, ReplyKeyboardMarkup, ReplyMarkup, TelegramApi,
}; };
use futures::Future;
use std::{error::Error, io, thread::JoinHandle}; use std::{error::Error, io, thread::JoinHandle};
pub trait Selector { 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>; 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 { pub struct TelegramSelector {
client: frankenstein::Api, client: frankenstein::Api,
dest_chat_id: String, dest_chat_id: String,
@ -19,7 +27,7 @@ pub struct ConsoleSelector {
} }
impl Selector for 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); println!("generated sample [y+enter to accept]: {}", &message);
let mut choice = String::new(); let mut choice = String::new();
io::stdin().read_line(&mut choice).expect("cum"); io::stdin().read_line(&mut choice).expect("cum");
@ -27,7 +35,7 @@ impl Selector for ConsoleSelector {
println!("accepted"); println!("accepted");
self.selected_samples.push(message); self.selected_samples.push(message);
} }
return None; Ok(())
} }
fn collect_selected_samples(&mut self) -> Vec<String> { fn collect_selected_samples(&mut self) -> Vec<String> {
@ -49,7 +57,7 @@ const KEEP_BUTTON: &str = "Keep";
const TOSS_BUTTON: &str = "Toss"; const TOSS_BUTTON: &str = "Toss";
impl Selector for TelegramSelector { 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!(); todo!();
if !self.listener_handle.is_none() { if !self.listener_handle.is_none() {
todo!(); todo!();
@ -64,12 +72,12 @@ impl Selector for TelegramSelector {
KeyboardButton::new(TOSS_BUTTON.to_string()), 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> { fn collect_selected_samples(&mut self) -> Vec<String> {