mirror of
https://github.com/timvisee/ffsend.git
synced 2025-01-31 19:51:35 +01:00
Nicely print CLI errors with their causes
This commit is contained in:
parent
a4b7736019
commit
8ae79c3e4f
46
Cargo.lock
generated
46
Cargo.lock
generated
@ -173,6 +173,14 @@ dependencies = [
|
|||||||
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "colored"
|
||||||
|
version = "1.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "constant_time_eq"
|
name = "constant_time_eq"
|
||||||
version = "0.1.3"
|
version = "0.1.3"
|
||||||
@ -331,6 +339,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clipboard 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clipboard 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"colored 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ffsend-api 0.1.0",
|
"ffsend-api 0.1.0",
|
||||||
"open 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"open 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -366,7 +375,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures"
|
name = "futures"
|
||||||
version = "0.1.19"
|
version = "0.1.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -374,7 +383,7 @@ 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"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -417,7 +426,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"base64 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -439,7 +448,7 @@ name = "hyper-tls"
|
|||||||
version = "0.1.3"
|
version = "0.1.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"hyper 0.11.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hyper 0.11.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -881,7 +890,7 @@ name = "relay"
|
|||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -899,7 +908,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"encoding_rs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"encoding_rs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"hyper 0.11.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hyper 0.11.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"hyper-tls 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hyper-tls 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libflate 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libflate 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1141,7 +1150,7 @@ name = "tokio"
|
|||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-executor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-executor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1157,7 +1166,7 @@ version = "0.1.16"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1174,7 +1183,7 @@ name = "tokio-executor"
|
|||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1183,7 +1192,7 @@ version = "0.1.6"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1192,7 +1201,7 @@ name = "tokio-proto"
|
|||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)",
|
"net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1209,7 +1218,7 @@ name = "tokio-reactor"
|
|||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1222,7 +1231,7 @@ name = "tokio-service"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1231,7 +1240,7 @@ version = "0.1.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1244,7 +1253,7 @@ version = "0.1.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam-deque 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"crossbeam-deque 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1256,7 +1265,7 @@ name = "tokio-tls"
|
|||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1268,7 +1277,7 @@ version = "0.1.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1460,6 +1469,7 @@ dependencies = [
|
|||||||
"checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536"
|
"checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536"
|
||||||
"checksum clipboard 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b9b4623b47d8637fc9d47564583d4cc01eb8c8e34e26b2bf348bf4b036acb657"
|
"checksum clipboard 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b9b4623b47d8637fc9d47564583d4cc01eb8c8e34e26b2bf348bf4b036acb657"
|
||||||
"checksum clipboard-win 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "14cc3e6c075926b96490d5f90d4a5af7be8012a4d8a8698e619655085a7641a3"
|
"checksum clipboard-win 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "14cc3e6c075926b96490d5f90d4a5af7be8012a4d8a8698e619655085a7641a3"
|
||||||
|
"checksum colored 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b0aa3473e85a3161b59845d6096b289bb577874cafeaf75ea1b1beaa6572c7fc"
|
||||||
"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e"
|
"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e"
|
||||||
"checksum core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67"
|
"checksum core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67"
|
||||||
"checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d"
|
"checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d"
|
||||||
@ -1480,7 +1490,7 @@ dependencies = [
|
|||||||
"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
||||||
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
|
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
|
||||||
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
|
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
|
||||||
"checksum futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f32b9e9aaa890fe8b9453b27ebbf3d11136a5ce59032500effd0e707bbcd80"
|
"checksum futures 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "0c5a3176836efa0b37f0e321b86672dfada1564aeb516fbed67b7c24050a0263"
|
||||||
"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
|
"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
|
||||||
"checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d"
|
"checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d"
|
||||||
"checksum hkdf 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "706d158974721895e9234c91af77ee28bbbf561fa276b014f32d685d27fbdc30"
|
"checksum hkdf 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "706d158974721895e9234c91af77ee28bbbf561fa276b014f32d685d27fbdc30"
|
||||||
|
@ -343,25 +343,25 @@ pub enum Error {
|
|||||||
/// A general error occurred while requesting the file data.
|
/// A general error occurred while requesting the file data.
|
||||||
/// This may be because authentication failed, because decrypting the
|
/// This may be because authentication failed, because decrypting the
|
||||||
/// file metadata didn't succeed, or due to some other reason.
|
/// file metadata didn't succeed, or due to some other reason.
|
||||||
#[fail(display = "failed to request file data")]
|
#[fail(display = "Failed to request file data")]
|
||||||
Request(#[cause] RequestError),
|
Request(#[cause] RequestError),
|
||||||
|
|
||||||
/// The given Send file has expired, or did never exist in the first place.
|
/// The given Send file has expired, or did never exist in the first place.
|
||||||
/// Therefore the file could not be downloaded.
|
/// Therefore the file could not be downloaded.
|
||||||
#[fail(display = "the file has expired or did never exist")]
|
#[fail(display = "The file has expired or did never exist")]
|
||||||
Expired,
|
Expired,
|
||||||
|
|
||||||
/// An error occurred while downloading the file.
|
/// An error occurred while downloading the file.
|
||||||
#[fail(display = "failed to download the file")]
|
#[fail(display = "Failed to download the file")]
|
||||||
Download(#[cause] DownloadError),
|
Download(#[cause] DownloadError),
|
||||||
|
|
||||||
/// An error occurred while decrypting the downloaded file.
|
/// An error occurred while decrypting the downloaded file.
|
||||||
#[fail(display = "failed to decrypt the downloaded file")]
|
#[fail(display = "Failed to decrypt the downloaded file")]
|
||||||
Decrypt,
|
Decrypt,
|
||||||
|
|
||||||
/// An error occurred while opening or writing to the target file.
|
/// An error occurred while opening or writing to the target file.
|
||||||
// TODO: show what file this is about
|
// TODO: show what file this is about
|
||||||
#[fail(display = "could not open the file for writing")]
|
#[fail(display = "Couldn't use the target file")]
|
||||||
File(#[cause] FileError),
|
File(#[cause] FileError),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,11 +374,11 @@ impl From<AuthError> for Error {
|
|||||||
#[derive(Fail, Debug)]
|
#[derive(Fail, Debug)]
|
||||||
pub enum RequestError {
|
pub enum RequestError {
|
||||||
/// Failed authenticating, in order to fetch the file data.
|
/// Failed authenticating, in order to fetch the file data.
|
||||||
#[fail(display = "failed to authenticate")]
|
#[fail(display = "Failed to authenticate")]
|
||||||
Auth(#[cause] AuthError),
|
Auth(#[cause] AuthError),
|
||||||
|
|
||||||
/// Failed to retrieve the file metadata.
|
/// Failed to retrieve the file metadata.
|
||||||
#[fail(display = "failed to retrieve file metadata")]
|
#[fail(display = "Failed to retrieve file metadata")]
|
||||||
Meta(#[cause] MetaError),
|
Meta(#[cause] MetaError),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,24 +386,24 @@ pub enum RequestError {
|
|||||||
pub enum AuthError {
|
pub enum AuthError {
|
||||||
/// Sending the request to gather the authentication encryption nonce
|
/// Sending the request to gather the authentication encryption nonce
|
||||||
/// failed.
|
/// failed.
|
||||||
#[fail(display = "failed to request authentication nonce")]
|
#[fail(display = "Failed to request authentication nonce")]
|
||||||
NonceReq,
|
NonceReq,
|
||||||
|
|
||||||
/// The response for fetching the authentication encryption nonce
|
/// The response for fetching the authentication encryption nonce
|
||||||
/// indicated an error and wasn't successful.
|
/// indicated an error and wasn't successful.
|
||||||
#[fail(display = "bad HTTP response '{}' while requesting authentication nonce", _1)]
|
#[fail(display = "Bad HTTP response '{}' while requesting authentication nonce", _1)]
|
||||||
NonceReqStatus(StatusCode, String),
|
NonceReqStatus(StatusCode, String),
|
||||||
|
|
||||||
/// No authentication encryption nonce was included in the response
|
/// No authentication encryption nonce was included in the response
|
||||||
/// from the server, it was missing.
|
/// from the server, it was missing.
|
||||||
#[fail(display = "missing authentication nonce in server response")]
|
#[fail(display = "Missing authentication nonce in server response")]
|
||||||
NoNonceHeader,
|
NoNonceHeader,
|
||||||
|
|
||||||
/// The authentication encryption nonce from the response malformed or
|
/// The authentication encryption nonce from the response malformed or
|
||||||
/// empty.
|
/// empty.
|
||||||
/// Maybe the server responded with a new format that isn't supported yet
|
/// Maybe the server responded with a new format that isn't supported yet
|
||||||
/// by this client.
|
/// by this client.
|
||||||
#[fail(display = "received malformed authentication nonce")]
|
#[fail(display = "Received malformed authentication nonce")]
|
||||||
MalformedNonce,
|
MalformedNonce,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -411,36 +411,36 @@ pub enum AuthError {
|
|||||||
pub enum MetaError {
|
pub enum MetaError {
|
||||||
/// An error occurred while computing the cryptographic signature used for
|
/// An error occurred while computing the cryptographic signature used for
|
||||||
/// decryption.
|
/// decryption.
|
||||||
#[fail(display = "failed to compute cryptographic signature")]
|
#[fail(display = "Failed to compute cryptographic signature")]
|
||||||
ComputeSignature,
|
ComputeSignature,
|
||||||
|
|
||||||
/// Sending the request to gather the metadata encryption nonce failed.
|
/// Sending the request to gather the metadata encryption nonce failed.
|
||||||
#[fail(display = "failed to request metadata nonce")]
|
#[fail(display = "Failed to request metadata nonce")]
|
||||||
NonceReq,
|
NonceReq,
|
||||||
|
|
||||||
/// The response for fetching the metadata encryption nonce indicated an
|
/// The response for fetching the metadata encryption nonce indicated an
|
||||||
/// error and wasn't successful.
|
/// error and wasn't successful.
|
||||||
#[fail(display = "bad HTTP response '{}' while requesting metadata nonce", _1)]
|
#[fail(display = "Bad HTTP response '{}' while requesting metadata nonce", _1)]
|
||||||
NonceReqStatus(StatusCode, String),
|
NonceReqStatus(StatusCode, String),
|
||||||
|
|
||||||
/// No metadata encryption nonce was included in the response from the
|
/// No metadata encryption nonce was included in the response from the
|
||||||
/// server, it was missing.
|
/// server, it was missing.
|
||||||
#[fail(display = "missing metadata nonce in server response")]
|
#[fail(display = "Missing metadata nonce in server response")]
|
||||||
NoNonceHeader,
|
NoNonceHeader,
|
||||||
|
|
||||||
/// The metadata encryption nonce from the response malformed or empty.
|
/// The metadata encryption nonce from the response malformed or empty.
|
||||||
/// Maybe the server responded with a new format that isn't supported yet
|
/// Maybe the server responded with a new format that isn't supported yet
|
||||||
/// by this client.
|
/// by this client.
|
||||||
#[fail(display = "received malformed metadata nonce")]
|
#[fail(display = "Received malformed metadata nonce")]
|
||||||
MalformedNonce,
|
MalformedNonce,
|
||||||
|
|
||||||
/// The received metadata is malformed, and couldn't be decoded or
|
/// The received metadata is malformed, and couldn't be decoded or
|
||||||
/// interpreted.
|
/// interpreted.
|
||||||
#[fail(display = "received malformed metadata")]
|
#[fail(display = "Received malformed metadata")]
|
||||||
Malformed,
|
Malformed,
|
||||||
|
|
||||||
/// Failed to decrypt the received metadata.
|
/// Failed to decrypt the received metadata.
|
||||||
#[fail(display = "failed to decrypt received metadata")]
|
#[fail(display = "Failed to decrypt received metadata")]
|
||||||
Decrypt,
|
Decrypt,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,47 +448,47 @@ pub enum MetaError {
|
|||||||
pub enum DownloadError {
|
pub enum DownloadError {
|
||||||
/// An error occurred while computing the cryptographic signature used for
|
/// An error occurred while computing the cryptographic signature used for
|
||||||
/// downloading the file.
|
/// downloading the file.
|
||||||
#[fail(display = "failed to compute cryptographic signature")]
|
#[fail(display = "Failed to compute cryptographic signature")]
|
||||||
ComputeSignature,
|
ComputeSignature,
|
||||||
|
|
||||||
/// Sending the request to gather the metadata encryption nonce failed.
|
/// Sending the request to gather the metadata encryption nonce failed.
|
||||||
#[fail(display = "failed to request file download")]
|
#[fail(display = "Failed to request file download")]
|
||||||
Request,
|
Request,
|
||||||
|
|
||||||
/// The response for downloading the indicated an error and wasn't successful.
|
/// The response for downloading the indicated an error and wasn't successful.
|
||||||
#[fail(display = "bad HTTP response '{}' while requesting file download", _1)]
|
#[fail(display = "Bad HTTP response '{}' while requesting file download", _1)]
|
||||||
RequestStatus(StatusCode, String),
|
RequestStatus(StatusCode, String),
|
||||||
|
|
||||||
/// The length of the file is missing, thus the length of the file to download
|
/// The length of the file is missing, thus the length of the file to download
|
||||||
/// couldn't be determined.
|
/// couldn't be determined.
|
||||||
#[fail(display = "couldn't determine file download length, missing property")]
|
#[fail(display = "Couldn't determine file download length, missing property")]
|
||||||
NoLength,
|
NoLength,
|
||||||
|
|
||||||
/// Failed to start or update the downloading progress, because of this the
|
/// Failed to start or update the downloading progress, because of this the
|
||||||
/// download can't continue.
|
/// download can't continue.
|
||||||
#[fail(display = "failed to update download progress")]
|
#[fail(display = "Failed to update download progress")]
|
||||||
Progress,
|
Progress,
|
||||||
|
|
||||||
/// The actual download and decryption process the server.
|
/// The actual download and decryption process the server.
|
||||||
/// This covers reading the file from the server, decrypting the file,
|
/// This covers reading the file from the server, decrypting the file,
|
||||||
/// and writing it to the file system.
|
/// and writing it to the file system.
|
||||||
#[fail(display = "failed to download the file")]
|
#[fail(display = "Failed to download the file")]
|
||||||
Download,
|
Download,
|
||||||
|
|
||||||
/// Verifiying the downloaded file failed.
|
/// Verifiying the downloaded file failed.
|
||||||
#[fail(display = "file verification failed")]
|
#[fail(display = "File verification failed")]
|
||||||
Verify,
|
Verify,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Fail, Debug)]
|
#[derive(Fail, Debug)]
|
||||||
pub enum FileError {
|
pub enum FileError {
|
||||||
/// An error occurred while creating or opening the file to write to.
|
/// An error occurred while creating or opening the file to write to.
|
||||||
#[fail(display = "failed to create or open file")]
|
#[fail(display = "Failed to create or replace the file")]
|
||||||
Create(#[cause] IoError),
|
Create(#[cause] IoError),
|
||||||
|
|
||||||
/// Failed to create an encrypted writer for the file, which is used to
|
/// Failed to create an encrypted writer for the file, which is used to
|
||||||
/// decrypt the downloaded file.
|
/// decrypt the downloaded file.
|
||||||
#[fail(display = "failed to create file decryptor")]
|
#[fail(display = "Failed to create file decryptor")]
|
||||||
EncryptedWriter,
|
EncryptedWriter,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ default = ["clipboard"]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.31"
|
clap = "2.31"
|
||||||
clipboard = { version = "0.4", optional = true }
|
clipboard = { version = "0.4", optional = true }
|
||||||
|
colored = "1.6"
|
||||||
failure = "0.1"
|
failure = "0.1"
|
||||||
ffsend-api = { version = "*", path = "../api" }
|
ffsend-api = { version = "*", path = "../api" }
|
||||||
open = "1"
|
open = "1"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
|
use failure::Fail;
|
||||||
use ffsend_api::action::download::Download as ApiDownload;
|
use ffsend_api::action::download::Download as ApiDownload;
|
||||||
use ffsend_api::file::file::DownloadFile;
|
use ffsend_api::file::file::DownloadFile;
|
||||||
use ffsend_api::reqwest::Client;
|
use ffsend_api::reqwest::Client;
|
||||||
@ -40,7 +41,7 @@ impl<'a> Download<'a> {
|
|||||||
// Execute an download action
|
// Execute an download action
|
||||||
// TODO: do not unwrap, but return an error
|
// TODO: do not unwrap, but return an error
|
||||||
if let Err(err) = ApiDownload::new(&file).invoke(&client, bar) {
|
if let Err(err) = ApiDownload::new(&file).invoke(&client, bar) {
|
||||||
quit_error(err);
|
quit_error(err.context("Failed to download the requested file"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: open the file, or it's location
|
// TODO: open the file, or it's location
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
extern crate failure;
|
||||||
extern crate ffsend_api;
|
extern crate ffsend_api;
|
||||||
|
|
||||||
mod action;
|
mod action;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#[cfg(feature = "clipboard")]
|
#[cfg(feature = "clipboard")]
|
||||||
extern crate clipboard;
|
extern crate clipboard;
|
||||||
extern crate failure;
|
extern crate colored;
|
||||||
extern crate open;
|
extern crate open;
|
||||||
|
|
||||||
#[cfg(feature = "clipboard")]
|
#[cfg(feature = "clipboard")]
|
||||||
@ -11,14 +11,33 @@ use std::process::{exit, ExitStatus};
|
|||||||
|
|
||||||
#[cfg(feature = "clipboard")]
|
#[cfg(feature = "clipboard")]
|
||||||
use self::clipboard::{ClipboardContext, ClipboardProvider};
|
use self::clipboard::{ClipboardContext, ClipboardProvider};
|
||||||
use self::failure::{Fail};
|
use self::colored::*;
|
||||||
|
use failure::{self, Fail};
|
||||||
use ffsend_api::url::Url;
|
use ffsend_api::url::Url;
|
||||||
|
|
||||||
|
/// Print the given error in a proper format for the user,
|
||||||
|
/// with it's causes.
|
||||||
|
pub fn print_error<E: Fail>(err: E) {
|
||||||
|
// Print the main error
|
||||||
|
eprintln!("{} {}", "error:".red().bold(), err);
|
||||||
|
|
||||||
|
// Print the causes
|
||||||
|
let mut cause = err.cause();
|
||||||
|
while let Some(err) = cause {
|
||||||
|
eprintln!("{} {}", "caused by:".red().bold(), err);
|
||||||
|
cause = err.cause();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Quit the application with an error code,
|
/// Quit the application with an error code,
|
||||||
/// and print the given error.
|
/// and print the given error.
|
||||||
pub fn quit_error<E: Fail>(err: E) -> ! {
|
pub fn quit_error<E: Fail>(err: E) -> ! {
|
||||||
// Print the error message
|
// Print the error
|
||||||
eprintln!("error: {}", err);
|
print_error(err);
|
||||||
|
|
||||||
|
// Print some additional information
|
||||||
|
eprintln!("\nFor detailed errors try '{}'", "--verbose".yellow());
|
||||||
|
eprintln!("For more information try '{}'", "--help".yellow());
|
||||||
|
|
||||||
// Quit
|
// Quit
|
||||||
exit(1);
|
exit(1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user