diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index ae5bbaf7..00000000 --- a/Cargo.lock +++ /dev/null @@ -1,1197 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "arrayvec" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "autocfg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "backtrace" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "backtrace-sys" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "base64" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bitflags" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "byteorder" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "bytes" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cc" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cfg-if" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "chrono" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-channel" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-deque" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-utils" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "dtoa" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "failure" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "failure_derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fnv" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-cpupool" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "h2" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "http" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "httparse" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "hyper" -version = "0.12.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "indexmap" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "iovec" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "itoa" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lambda_http" -version = "0.1.1" -dependencies = [ - "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "lambda_runtime 0.2.1", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "simple_logger 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lambda_runtime" -version = "0.2.1" -dependencies = [ - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lambda_runtime_core 0.1.2", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "simple-error 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "simple_logger 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lambda_runtime_client" -version = "0.2.2" -dependencies = [ - "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.24 (registry+https://github.com/rust-lang/crates.io-index)", - "lambda_runtime_errors 0.1.1", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lambda_runtime_core" -version = "0.1.2" -dependencies = [ - "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.24 (registry+https://github.com/rust-lang/crates.io-index)", - "lambda_runtime_client 0.2.2", - "lambda_runtime_errors 0.1.1", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "simple_logger 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lambda_runtime_errors" -version = "0.1.1" -dependencies = [ - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lambda_runtime_core 0.1.2", - "lambda_runtime_errors_derive 0.1.1", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lambda_runtime_errors_derive" -version = "0.1.1" -dependencies = [ - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lambda_runtime_errors 0.1.1", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lazy_static" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libc" -version = "0.2.48" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "lock_api" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "log" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "maplit" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "memoffset" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "mio" -version = "0.6.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mio-uds" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "miow" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "net2" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "nodrop" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "num-integer" -version = "0.1.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-traits" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "num_cpus" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "owning_ref" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "proc-macro2" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "quote" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_jitter" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_os" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_pcg" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "redox_syscall" -version = "0.1.51" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rustc-demangle" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ryu" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "scopeguard" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde" -version = "1.0.87" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde_derive" -version = "1.0.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_json" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_urlencoded" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "simple-error" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "simple_logger" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "slab" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "smallvec" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stable_deref_trait" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "string" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "syn" -version = "0.15.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "synstructure" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "time" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-fs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-codec" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-current-thread" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-executor" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-fs" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-io" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-reactor" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-sync" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-tcp" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (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.16 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-threadpool" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-timer" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-udp" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-uds" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "try-lock" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicode-bidi" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "want" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[metadata] -"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" -"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" -"checksum backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b493b66e03090ebc4343eb02f94ff944e0cbc9ac6571491d170ba026741eb5" -"checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" -"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" -"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" -"checksum bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "40ade3d27603c2cb345eb0912aec461a6dec7e06a4ae48589904e808335c7afa" -"checksum cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)" = "4390a3b5f4f6bce9c1d0c00128379df433e53777fdd30e92f16a529332baec4e" -"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" -"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" -"checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" -"checksum crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13" -"checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" -"checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" -"checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd" -"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" -"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" -"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"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 futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" -"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" -"checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" -"checksum http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "1a10e5b573b9a0146545010f50772b9e8b1dd0a256564cc4307694c68832a2f5" -"checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" -"checksum hyper 0.12.24 (registry+https://github.com/rust-lang/crates.io-index)" = "fdfa9b401ef6c4229745bb6e9b2529192d07b920eed624cdee2a82348cd550af" -"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -"checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" -"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" -"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "e962c7641008ac010fa60a7dfdc1712449f29c44ef2d4702394aea943ee75047" -"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" -"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" -"checksum maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08cbb6b4fef96b6d77bfc40ec491b1690c779e77b05cd9f07f787ed376fd4c43" -"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" -"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" -"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" -"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" -"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" -"checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" -"checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" -"checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" -"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" -"checksum rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b7c690732391ae0abafced5015ffb53656abfaec61b342290e5eb56b286a679d" -"checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" -"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" -"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)" = "2e20fde37801e83c891a2dc4ebd3b81f0da4d1fb67a9e0a2a3b921e2536a58ee" -"checksum serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)" = "633e97856567e518b59ffb2ad7c7a4fd4c5d91d9c7f32dd38a27b2bf7e8114ea" -"checksum serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "27dce848e7467aa0e2fcaf0a413641499c0b745452aaca1194d24dedde9e13c9" -"checksum serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d48f9f99cd749a2de71d29da5f948de7f2764cc5a9d7f3c97e3514d4ee6eabf2" -"checksum simple-error 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "c00e871264295428089fb278c4b225be3ca92c227c918857f2e562bac973257b" -"checksum simple_logger 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "25111f1d77db1ac3ee11b62ba4b7a162e6bb3be43e28273f0d3935cc8d3ff7fb" -"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" -"checksum smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "88aea073965ab29f6edb5493faf96ad662fb18aa9eeb186a3b7057951605ed15" -"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" -"checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" -"checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" -"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "e0500b88064f08bebddd0c0bed39e19f5c567a5f30975bee52b0c0d3e2eeb38c" -"checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "331c8acc267855ec06eb0c94618dcbbfea45bed2d20b77252940095273fb58f6" -"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" -"checksum tokio-fs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0e9cbbc8a3698b7ab652340f46633364f9eaa928ddaaee79d8b8f356dd79a09d" -"checksum tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b53aeb9d3f5ccf2ebb29e19788f96987fa1355f8fe45ea193928eaaaf3ae820f" -"checksum tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afbcdb0f0d2a1e4c440af82d7bbf0bf91a8a8c0575bcd20c05d15be7e9d3a02f" -"checksum tokio-sync 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3742b64166c1ee9121f1921aea5a726098458926a6b732d906ef23b1f3ef6f4f" -"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c3fd86cb15547d02daa2b21aadaf4e37dee3368df38a526178a5afa3c034d2fb" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" -"checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" -"checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" -"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" -"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -"checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" -"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/lambda-http/examples/basic.rs b/lambda-http/examples/http.rs similarity index 100% rename from lambda-http/examples/basic.rs rename to lambda-http/examples/http.rs diff --git a/lambda-http/src/ext.rs b/lambda-http/src/ext.rs index 11062045..70ee534a 100644 --- a/lambda-http/src/ext.rs +++ b/lambda-http/src/ext.rs @@ -61,7 +61,7 @@ pub enum PayloadError { /// } /// /// fn main() { -/// lambda!(handler) +/// lambda!(handler); /// } /// /// fn handler( diff --git a/lambda-http/src/lib.rs b/lambda-http/src/lib.rs index 9af6bb59..04b440dc 100644 --- a/lambda-http/src/lib.rs +++ b/lambda-http/src/lib.rs @@ -17,7 +17,7 @@ //! use lambda_runtime::{Context, error::HandlerError}; //! //! fn main() { -//! lambda!(hello) +//! lambda!(hello); //! } //! //! fn hello( @@ -49,7 +49,7 @@ //! .unwrap_or_else(|| "stranger") //! ) //! ) -//! ) +//! ); //! } //! ``` @@ -58,9 +58,13 @@ #[macro_use] extern crate maplit; +pub use tokio; + pub use http::{self, Response}; + use lambda_runtime::{self as lambda, error::HandlerError, Context}; -use tokio::runtime::Runtime as TokioRuntime; + +use tokio::prelude::future::{Future, IntoFuture}; mod body; mod ext; @@ -75,16 +79,19 @@ use crate::{request::LambdaRequest, response::LambdaResponse}; pub type Request = http::Request; /// Functions serving as ALB and API Gateway handlers must conform to this type. -pub trait Handler { +pub trait Handler: Send + where Fut: IntoFuture { /// Run the handler. - fn run(&mut self, event: Request, ctx: Context) -> Result; + fn run(&mut self, event: Request, ctx: Context) -> Fut; } -impl Handler for F +impl Handler for Fun where - F: FnMut(Request, Context) -> Result, + Fun: FnMut(Request, Context) -> Fut + Send, + Fut: IntoFuture + Send, + Fut::Future: Send + 'static, { - fn run(&mut self, event: Request, ctx: Context) -> Result { + fn run(&mut self, event: Request, ctx: Context) -> Fut { (*self)(event, ctx) } } @@ -97,19 +104,21 @@ where /// /// # Panics /// The function panics if the Lambda environment variables are not set. -pub fn start(f: impl Handler, runtime: Option) +pub fn start(f: impl Handler) -> impl Future where - R: IntoResponse, + Ret: IntoResponse, + Fut: IntoFuture + Send, + Fut::Future: Send + 'static, { // handler requires a mutable ref let mut func = f; lambda::start( - |req: LambdaRequest<'_>, ctx: Context| { + move |req: LambdaRequest<'_>, ctx: Context| { let is_alb = req.request_context.is_alb(); - func.run(req.into(), ctx) - .map(|resp| LambdaResponse::from_response(is_alb, resp.into_response())) + func.run(req.into(), ctx).into_future() + .map(move |resp| LambdaResponse::from_response(is_alb, resp.into_response())) }, - runtime, + // runtime, ) } @@ -117,15 +126,15 @@ where #[macro_export] macro_rules! lambda { ($handler:expr) => { - $crate::start($handler, None) + $crate::tokio::run($crate::start($handler)) }; ($handler:expr, $runtime:expr) => { - $crate::start($handler, Some($runtime)) + $runtime.spawn($crate::start($handler)) }; ($handler:ident) => { - $crate::start($handler, None) + $crate::tokio::run($crate::start($handler)) }; ($handler:ident, $runtime:expr) => { - $crate::start($handler, Some($runtime)) + $runtime.spawn($crate::start($handler)) }; } diff --git a/lambda-runtime-client/Cargo.toml b/lambda-runtime-client/Cargo.toml index bf5dcef9..5614eb1b 100644 --- a/lambda-runtime-client/Cargo.toml +++ b/lambda-runtime-client/Cargo.toml @@ -27,4 +27,5 @@ lambda_runtime_errors = { path = "../lambda-runtime-errors", version = "^0.1" } failure = "^0.1" [dev-dependencies] -chrono = "^0.4" \ No newline at end of file +chrono = "^0.4" +lambda_runtime_errors_derive = { path = "../lambda-runtime-errors-derive", version = "^0.1" } \ No newline at end of file diff --git a/lambda-runtime-client/src/client.rs b/lambda-runtime-client/src/client.rs index 11e70dd2..69016f63 100644 --- a/lambda-runtime-client/src/client.rs +++ b/lambda-runtime-client/src/client.rs @@ -1,16 +1,16 @@ use crate::error::{ApiError, ApiErrorKind, ErrorResponse}; -use failure::ResultExt; +use failure::{ResultExt, Fail}; use hyper::{ client::HttpConnector, header::{self, HeaderMap, HeaderValue}, - rt::{Future, Stream}, Body, Client, Method, Request, Uri, }; use log::*; use serde_derive::*; use serde_json; use std::{collections::HashMap, fmt}; -use tokio::runtime::Runtime; + +use tokio::prelude::{stream::Stream, future::{self, Future, Either}}; const RUNTIME_API_VERSION: &str = "2018-06-01"; const API_CONTENT_TYPE: &str = "application/json"; @@ -123,7 +123,7 @@ pub struct EventContext { /// Used by the Runtime to communicate with the internal endpoint. pub struct RuntimeClient { - _runtime: Runtime, + // _runtime: Runtime, http_client: Client, next_endpoint: Uri, runtime_agent: String, @@ -137,7 +137,7 @@ impl<'ev> RuntimeClient { /// identify the runtime being used by the function. For example, the `lambda_runtime_core` crate /// uses `AWS_Lambda_Rust/0.1.0 (rustc/1.31.1-stable)`. The runtime client can also receive an /// instance of Tokio Runtime to use. - pub fn new(host: &str, agent: Option, runtime: Option) -> Result { + pub fn new(host: &str, agent: Option) -> Result { debug!("Starting new HttpRuntimeClient for {}", host); let runtime_agent = match agent { Some(a) => a, @@ -145,19 +145,20 @@ impl<'ev> RuntimeClient { }; // start a tokio core main event loop for hyper - let runtime = match runtime { - Some(r) => r, - None => Runtime::new().context(ApiErrorKind::Unrecoverable("Could not initialize runtime".to_string()))?, - }; + // let runtime = match runtime { + // Some(r) => r, + // None => Runtime::new().context(ApiErrorKind::Unrecoverable("Could not initialize runtime".to_string()))?, + // }; - let http_client = Client::builder().executor(runtime.executor()).build_http(); + //let http_client = Client::builder().executor(runtime.executor()).build_http(); + let http_client = Client::new(); // we cached the parsed Uri since this never changes. let next_endpoint = format!("http://{}/{}/runtime/invocation/next", host, RUNTIME_API_VERSION) .parse::() .context(ApiErrorKind::Unrecoverable("Could not parse API uri".to_string()))?; Ok(RuntimeClient { - _runtime: runtime, + // _runtime: runtime, http_client, next_endpoint, runtime_agent, @@ -168,51 +169,52 @@ impl<'ev> RuntimeClient { impl<'ev> RuntimeClient { /// Polls for new events to the Runtime APIs. - pub fn next_event(&self) -> Result<(Vec, EventContext), ApiError> { + pub fn next_event(&self) -> impl Future, EventContext), Error=ApiError> + Send { trace!("Polling for next event"); - // We wait instead of processing the future asynchronously because AWS Lambda - // itself enforces only one event per container at a time. No point in taking on - // the additional complexity. - let resp = self - .http_client - .get(self.next_endpoint.clone()) - .wait() - .context(ApiErrorKind::Unrecoverable("Could not fetch next event".to_string()))?; - - if resp.status().is_client_error() { - error!( - "Runtime API returned client error when polling for new events: {}", - resp.status() - ); - Err(ApiErrorKind::Recoverable(format!( - "Error {} when polling for events", - resp.status() - )))?; - } - if resp.status().is_server_error() { - error!( - "Runtime API returned server error when polling for new events: {}", - resp.status() - ); - Err(ApiErrorKind::Unrecoverable( - "Server error when polling for new events".to_string(), - ))?; - } - let ctx = self.get_event_context(&resp.headers())?; - let out = resp - .into_body() - .concat2() - .wait() - .context(ApiErrorKind::Recoverable("Could not read event boxy".to_string()))?; - let buf = out.into_bytes().to_vec(); - - trace!( - "Received new event for request id {}. Event length {} bytes", - ctx.aws_request_id, - buf.len() - ); - Ok((buf, ctx)) + self.http_client.get(self.next_endpoint.clone()) + .map_err(|e| -> ApiError { + e.context(ApiErrorKind::Unrecoverable("Could not fetch next event".to_string())).into() + }) + .and_then(|resp| { + if resp.status().is_client_error() { + error!( + "Runtime API returned client error when polling for new events: {}", + resp.status() + ); + return Either::A(future::err(ApiErrorKind::Recoverable(format!( + "Error {} when polling for events", + resp.status() + )).into())); + } + if resp.status().is_server_error() { + error!( + "Runtime API returned server error when polling for new events: {}", + resp.status() + ); + return Either::A(future::err(ApiErrorKind::Unrecoverable( + "Server error when polling for new events".to_string(), + ).into())); + } + let ctx = match Self::get_event_context(&resp.headers()) { + Ok(c) => c, + Err(e) => return Either::A(future::err(e)), + }; + + Either::B(resp.into_body() + .concat2() + .map_err(|e| e.context(ApiErrorKind::Recoverable("Could not read event body".to_string())).into()) + .and_then(|out| { + let buf = out.into_bytes().to_vec(); + + trace!( + "Received new event for request id {}. Event length {} bytes", + ctx.aws_request_id, + buf.len() + ); + Ok((buf, ctx)) + })) + }) } /// Calls the Lambda Runtime APIs to submit a response to an event. In this function we treat @@ -227,40 +229,37 @@ impl<'ev> RuntimeClient { /// /// # Returns /// A `Result` object containing a bool return value for the call or an `error::ApiError` instance. - pub fn event_response(&self, request_id: &str, output: &[u8]) -> Result<(), ApiError> { + pub fn event_response(&self, request_id: &str, output: &[u8]) -> impl Future + Send { trace!( "Posting response for request {} to Runtime API. Response length {} bytes", request_id, output.len() ); - let uri = format!( - "http://{}/{}/runtime/invocation/{}/response", - self.host, RUNTIME_API_VERSION, request_id - ) - .parse::() - .context(ApiErrorKind::Unrecoverable( - "Could not generate response uri".to_owned(), - ))?; + let uri = match format!("http://{}/{}/runtime/invocation/{}/response", self.host, RUNTIME_API_VERSION, request_id).parse::() { + Ok(u) => u, + Err(e) => return Either::A(future::err(e.context(ApiErrorKind::Unrecoverable("Could not generate response uri".to_owned())).into())), + }; + let req = self.get_runtime_post_request(&uri, output); - let resp = self - .http_client - .request(req) - .wait() - .context(ApiErrorKind::Recoverable("Could not post event response".to_string()))?; - if !resp.status().is_success() { - error!( - "Error from Runtime API when posting response for request {}: {}", - request_id, - resp.status() - ); - Err(ApiErrorKind::Recoverable(format!( - "Error {} while sending response", - resp.status() - )))?; - } - trace!("Posted response to Runtime API for request {}", request_id); - Ok(()) + let request_id = request_id.to_owned(); + Either::B(self.http_client.request(req) + .map_err(|e| e.context(ApiErrorKind::Recoverable("Could not post event response".to_string())).into()) + .and_then(move |resp| { + if !resp.status().is_success() { + error!( + "Error from Runtime API when posting response for request {}: {}", + request_id, + resp.status() + ); + Err(ApiErrorKind::Recoverable(format!( + "Error {} while sending response", + resp.status() + )))?; + } + trace!("Posted response to Runtime API for request {}", request_id); + Ok(()) + })) } /// Calls Lambda's Runtime APIs to send an error generated by the `Handler`. Because it's rust, @@ -273,38 +272,37 @@ impl<'ev> RuntimeClient { /// /// # Returns /// A `Result` object containing a bool return value for the call or an `error::ApiError` instance. - pub fn event_error(&self, request_id: &str, e: &ErrorResponse) -> Result<(), ApiError> { + pub fn event_error(&self, request_id: &str, e: &ErrorResponse) -> impl Future { trace!( "Posting error to runtime API for request {}: {}", request_id, e.error_message ); - let uri = format!( - "http://{}/{}/runtime/invocation/{}/error", - self.host, RUNTIME_API_VERSION, request_id - ) - .parse::() - .context(ApiErrorKind::Unrecoverable( - "Could not generate response uri".to_owned(), - ))?; + let uri = match format!("http://{}/{}/runtime/invocation/{}/error", self.host, RUNTIME_API_VERSION, request_id).parse::() { + Ok(u) => u, + Err(e) => return Either::A(future::err(e.context(ApiErrorKind::Unrecoverable("Could not generate response uri".to_owned())).into())), + }; + let req = self.get_runtime_error_request(&uri, &e); - let resp = self.http_client.request(req).wait().context(ApiErrorKind::Recoverable( - "Could not post event error response".to_string(), - ))?; - if !resp.status().is_success() { - error!( - "Error from Runtime API when posting error response for request {}: {}", - request_id, - resp.status() - ); - Err(ApiErrorKind::Recoverable(format!( - "Error {} while sending response", - resp.status() - )))?; - } - trace!("Posted error response for request id {}", request_id); - Ok(()) + let request_id = request_id.to_owned(); + Either::B(self.http_client.request(req) + .map_err(|e| e.context(ApiErrorKind::Recoverable("Could not post event error response".to_string())).into()) + .and_then(move |resp| { + if !resp.status().is_success() { + error!( + "Error from Runtime API when posting error response for request {}: {}", + request_id, + resp.status() + ); + Err(ApiErrorKind::Recoverable(format!( + "Error {} while sending response", + resp.status() + )))?; + } + trace!("Posted error response for request id {}", request_id); + Ok(()) + })) } /// Calls the Runtime APIs to report a failure during the init process. @@ -318,7 +316,7 @@ impl<'ev> RuntimeClient { /// # Panics /// If it cannot send the init error. In this case we panic to force the runtime /// to restart. - pub fn fail_init(&self, e: &ErrorResponse) { + pub fn fail_init(&self, e: &ErrorResponse) -> impl Future { error!("Calling fail_init Runtime API: {}", e.error_message); let uri = format!("http://{}/{}/runtime/init/error", self.host, RUNTIME_API_VERSION) .parse::() @@ -330,7 +328,6 @@ impl<'ev> RuntimeClient { self.http_client .request(req) - .wait() .map_err(|e| { error!("Error while sending init failed message: {}", e); panic!("Error while sending init failed message: {}", e); @@ -338,7 +335,6 @@ impl<'ev> RuntimeClient { .map(|resp| { info!("Successfully sent error response to the runtime API: {:?}", resp); }) - .expect("Could not complete init_fail request"); } /// Returns the endpoint configured for this HTTP Runtime client. @@ -393,7 +389,7 @@ impl<'ev> RuntimeClient { /// A `Result` containing the populated `EventContext` or an `ApiError` if the required headers /// were not present or the client context and cognito identity could not be parsed from the /// JSON string. - fn get_event_context(&self, headers: &HeaderMap) -> Result { + fn get_event_context(headers: &HeaderMap) -> Result { // let headers = resp.headers(); let aws_request_id = header_string( @@ -498,10 +494,9 @@ pub(crate) mod tests { #[test] fn get_event_context_with_empty_trace_id() { - let client = RuntimeClient::new("localhost:8081", None, None).expect("Could not initialize runtime client"); let mut headers = get_headers(); headers.remove(LambdaHeaders::TraceId.as_str()); - let headers_result = client.get_event_context(&headers); + let headers_result = RuntimeClient::get_event_context(&headers); assert_eq!(false, headers_result.is_err()); let ok_result = headers_result.unwrap(); assert_eq!(None, ok_result.xray_trace_id); @@ -510,9 +505,8 @@ pub(crate) mod tests { #[test] fn get_event_context_populates_trace_id_when_present() { - let client = RuntimeClient::new("localhost:8081", None, None).expect("Could not initialize runtime client"); let headers = get_headers(); - let headers_result = client.get_event_context(&headers); + let headers_result = RuntimeClient::get_event_context(&headers); assert_eq!(false, headers_result.is_err()); assert_eq!(Some("trace".to_owned()), headers_result.unwrap().xray_trace_id); } diff --git a/lambda-runtime-client/src/lib.rs b/lambda-runtime-client/src/lib.rs index 85089ecc..c08c003f 100644 --- a/lambda-runtime-client/src/lib.rs +++ b/lambda-runtime-client/src/lib.rs @@ -14,12 +14,17 @@ //! # Examples //! //! ```rust,no_run +//! #[macro_use] +//! extern crate lambda_runtime_errors_derive; //! extern crate lambda_runtime_client; //! #[macro_use] //! extern crate serde_derive; //! extern crate serde_json; +//! extern crate tokio; //! //! use lambda_runtime_client::{RuntimeClient, EventContext}; +//! use tokio::prelude::future::{Future, Either}; +//! use failure::Fail; //! //! #[derive(Serialize, Deserialize, Debug)] //! struct CustomEvent { @@ -30,29 +35,41 @@ //! struct CustomResponse { //! surname: String, //! } +//! +//! #[derive(LambdaErrorExt, Fail, Debug)] +//! #[fail(display = "Input was invalid")] +//! struct CustomErrorType; +//! +//! impl CustomErrorType { +//! fn new(_: &str) -> Self { +//! Self {} +//! } +//! } //! //! fn main() { -//! let client = RuntimeClient::new("http://localhost:8080", None, None) +//! let client = RuntimeClient::new("http://localhost:8080", None) //! .expect("Could not initialize client"); //! -//! let (event_data, event_context) = client.next_event() -//! .expect("Could not retrieve next event"); -//! let custom_event: CustomEvent = serde_json::from_slice(&event_data) -//! .expect("Could not turn Vec into CustomEvent object"); -//! -//! println!("Event for {}", custom_event.name); -//! if custom_event.name == "John" { -//! let resp_object = CustomResponse{ surname: String::from("Doe")}; -//! let resp_vec = serde_json::to_vec(&resp_object) -//! .expect("Could not serialize CustomResponse to Vec"); -//! client.event_response(&event_context.aws_request_id, &resp_vec) -//! .expect("Response sent successfully"); -//! } else { -//! // return a custom error by implementing the RuntimeApiError trait. -//! // See the error module for examples. -//! //client.event_error(&event_context.aws_request_id, CustomErrorType::new("Invalid first name")) -//! // .expect("Could not send error response"); -//! } +//! tokio::run(client.next_event() +//! .map_err(|_| panic!("Could not retrieve next event")) +//! .and_then(move |(event_data, event_context)| { +//! let custom_event: CustomEvent = serde_json::from_slice(&event_data) +//! .expect("Could not turn Vec into CustomEvent object"); +//! +//! println!("Event for {}", custom_event.name); +//! if custom_event.name == "John" { +//! let resp_object = CustomResponse{ surname: String::from("Doe")}; +//! let resp_vec = serde_json::to_vec(&resp_object) +//! .expect("Could not serialize CustomResponse to Vec"); +//! Either::A(client.event_response(&event_context.aws_request_id, &resp_vec) +//! .map_err(|_| panic!("Response sent successfully"))) +//! } else { +//! // return a custom error by implementing the RuntimeApiError trait. +//! // See the error module for examples. +//! Either::B(client.event_error(&event_context.aws_request_id, &CustomErrorType::new("Invalid first name").into()) +//! .map_err(|_| panic!("Could not send error response"))) +//! } +//! })); //! } //! ``` diff --git a/lambda-runtime-core/src/handler.rs b/lambda-runtime-core/src/handler.rs index 41d2eff5..3f359ce9 100644 --- a/lambda-runtime-core/src/handler.rs +++ b/lambda-runtime-core/src/handler.rs @@ -2,19 +2,21 @@ use crate::context::Context; use failure::Fail; use lambda_runtime_errors::LambdaErrorExt; use std::fmt::Display; +use tokio::prelude::future::IntoFuture; /// Functions acting as a handler must conform to this type. -pub trait Handler { +pub trait Handler: Send { /// Run the handler. - fn run(&mut self, event: Vec, ctx: Context) -> Result, EventError>; + fn run(&mut self, event: Vec, ctx: Context) -> Fut; } -impl<'ev, Function, EventError> Handler for Function +impl<'ev, Function, EventError, Fut> Handler for Function where - Function: FnMut(Vec, Context) -> Result, EventError>, + Function: FnMut(Vec, Context) -> Fut + Send, EventError: Fail + LambdaErrorExt + Display + Send + Sync, + Fut: IntoFuture, Error=EventError> + Send, { - fn run(&mut self, event: Vec, ctx: Context) -> Result, EventError> { + fn run(&mut self, event: Vec, ctx: Context) -> Fut { (*self)(event, ctx) } } diff --git a/lambda-runtime-core/src/lib.rs b/lambda-runtime-core/src/lib.rs index 7a52c1d1..29ed81d0 100644 --- a/lambda-runtime-core/src/lib.rs +++ b/lambda-runtime-core/src/lib.rs @@ -15,6 +15,8 @@ mod error; mod handler; mod runtime; +pub use tokio; + pub use crate::{ context::Context, env::{ConfigProvider, EnvConfigProvider}, diff --git a/lambda-runtime-core/src/runtime.rs b/lambda-runtime-core/src/runtime.rs index 35357322..2d238660 100644 --- a/lambda-runtime-core/src/runtime.rs +++ b/lambda-runtime-core/src/runtime.rs @@ -9,7 +9,8 @@ use lambda_runtime_client::{error::ErrorResponse, RuntimeClient}; use lambda_runtime_errors::LambdaErrorExt; use log::*; use std::{fmt::Display, marker::PhantomData}; -use tokio::runtime::Runtime as TokioRuntime; + +use tokio::prelude::future::{Future, Loop, Either, loop_fn, IntoFuture}; // include file generated during the build process include!(concat!(env!("OUT_DIR"), "/metadata.rs")); @@ -24,11 +25,13 @@ const MAX_RETRIES: i8 = 3; /// /// # Panics /// The function panics if the Lambda environment variables are not set. -pub fn start(f: impl Handler, runtime: Option) +pub fn start(f: impl Handler) -> impl Future + Send where EventError: Fail + LambdaErrorExt + Display + Send + Sync, + Fut: IntoFuture, Error=EventError> + Send, + Fut::Future: Send, { - start_with_config(f, &EnvConfigProvider::default(), runtime) + start_with_config(f, &EnvConfigProvider::default()) } #[macro_export] @@ -37,16 +40,16 @@ where /// `runtime` to build the listener on. If none is provided, it creates its own. macro_rules! lambda { ($handler:ident) => { - $crate::start($handler, None) + $crate::tokio::run($crate::start($handler)) }; ($handler:ident, $runtime:expr) => { - $crate::start($handler, Some($runtime)) + $runtime.spawn($crate::start($handler)) }; ($handler:expr) => { - $crate::start($handler, None) + $crate::tokio::run($crate::start($handler)) }; ($handler:expr, $runtime:expr) => { - $crate::start($handler, Some($runtime)) + $runtime.spawn($crate::start($handler)) }; } @@ -63,13 +66,16 @@ macro_rules! lambda { /// The function panics if the `ConfigProvider` returns an error from the `get_runtime_api_endpoint()` /// or `get_function_settings()` methods. The panic forces AWS Lambda to terminate the environment /// and spin up a new one for the next invocation. -pub fn start_with_config( - f: impl Handler, +pub fn start_with_config( + f: impl Handler, config: &Config, - runtime: Option, -) where + // runtime: Option, +) -> impl Future + Send +where Config: ConfigProvider, EventError: Fail + LambdaErrorExt + Display + Send + Sync, + Fut: IntoFuture, Error=EventError> + Send, + Fut::Future: Send, { // if we cannot find the endpoint we panic, nothing else we can do. let endpoint: String; @@ -93,9 +99,9 @@ pub fn start_with_config( let info = Option::from(runtime_release().to_owned()); - match RuntimeClient::new(&endpoint, info, runtime) { + match RuntimeClient::new(&endpoint, info) { Ok(client) => { - start_with_runtime_client(f, function_config, client); + start_with_runtime_client(f, function_config, client) } Err(e) => { panic!("Could not create runtime client SDK: {}", e); @@ -114,34 +120,39 @@ pub fn start_with_config( /// /// # Panics /// The function panics if we cannot instantiate a new `RustRuntime` object. -pub(crate) fn start_with_runtime_client( - f: impl Handler, +pub(crate) fn start_with_runtime_client( + f: impl Handler, func_settings: FunctionSettings, client: RuntimeClient, -) where +) -> impl Future + Send +where EventError: Fail + LambdaErrorExt + Display + Send + Sync, + Fut: IntoFuture, Error=EventError> + Send, + Fut::Future: Send, { - let mut lambda_runtime: Runtime<_, EventError> = Runtime::new(f, func_settings, MAX_RETRIES, client); + let lambda_runtime: Runtime<_, EventError, _> = Runtime::new(f, func_settings, MAX_RETRIES, client); // start the infinite loop - lambda_runtime.start(); + lambda_runtime.start() } /// Internal representation of the runtime object that polls for events and communicates /// with the Runtime APIs -pub(super) struct Runtime { +pub(super) struct Runtime { runtime_client: RuntimeClient, handler: Function, max_retries: i8, settings: FunctionSettings, - _phantom: PhantomData, + _phantom1: PhantomData, + _phantom2: PhantomData, } // generic methods implementation -impl Runtime +impl Runtime where - Function: Handler, + Function: Handler, EventError: Fail + LambdaErrorExt + Display + Send + Sync, + Fut: IntoFuture, Error=EventError> + Send, { /// Creates a new instance of the `Runtime` object populated with the environment /// settings. @@ -168,76 +179,87 @@ where settings: config, handler: f, max_retries: retries, - _phantom: PhantomData, + _phantom1: PhantomData, + _phantom2: PhantomData, } } } // implementation of methods that require the Event and Output types // to be compatible with `serde`'s Deserialize/Serialize. -impl Runtime +impl Runtime where - Function: Handler, + Function: Handler, EventError: Fail + LambdaErrorExt + Display + Send + Sync, + Fut: IntoFuture, Error=EventError> + Send, + Fut::Future: Send, { /// Starts the main event loop and begin polling or new events. If one of the /// Runtime APIs returns an unrecoverable error this method calls the init failed /// API and then panics. - fn start(&mut self) { + fn start(self) -> impl Future + Send { debug!("Beginning main event loop"); - loop { - let (event, ctx) = self.get_next_event(0, None); - let request_id = ctx.aws_request_id.clone(); - info!("Received new event with AWS request id: {}", request_id); - let function_outcome = self.invoke(event, ctx); - match function_outcome { - Ok(response) => { - debug!( - "Function executed succesfully for {}, pushing response to Runtime API", - request_id - ); - match self.runtime_client.event_response(&request_id, &response) { - Ok(_) => info!("Response for {} accepted by Runtime API", request_id), - // unrecoverable error while trying to communicate with the endpoint. - // we let the Lambda Runtime API know that we have died - Err(e) => { - error!("Could not send response for {} to Runtime API: {}", request_id, e); - if !e.is_recoverable() { - error!( - "Error for {} is not recoverable, sending fail_init signal and panicking.", - request_id - ); - self.runtime_client.fail_init(&ErrorResponse::from(e)); - panic!("Could not send response"); - } - } + loop_fn(self, |runtime| { + runtime.get_next_event(0, None).and_then(|(mut runtime, event, ctx)| { + let request_id = ctx.aws_request_id.clone(); + info!("Received new event with AWS request id: {}", request_id); + runtime.invoke(event, ctx).into_future().then(|function_outcome| match function_outcome { + Ok(response) => { + debug!( + "Function executed succesfully for {}, pushing response to Runtime API", + request_id + ); + Either::A(runtime.runtime_client.event_response(&request_id, &response) + .then(move |r| { + match r { + Ok(_) => info!("Response for {} accepted by Runtime API", request_id), + // unrecoverable error while trying to communicate with the endpoint. + // we let the Lambda Runtime API know that we have died + Err(e) => { + error!("Could not send response for {} to Runtime API: {}", request_id, e); + if !e.is_recoverable() { + error!( + "Error for {} is not recoverable, sending fail_init signal and panicking.", + request_id + ); + runtime.runtime_client.fail_init(&ErrorResponse::from(e)); + panic!("Could not send response"); + } + }, + } + Ok(Loop::Continue(runtime)) + })) } - } - Err(e) => { - error!("Handler returned an error for {}: {}", request_id, e); - debug!("Attempting to send error response to Runtime API for {}", request_id); - match self.runtime_client.event_error(&request_id, &ErrorResponse::from(e)) { - Ok(_) => info!("Error response for {} accepted by Runtime API", request_id), - Err(e) => { - error!("Unable to send error response for {} to Runtime API: {}", request_id, e); - if !e.is_recoverable() { - error!( - "Error for {} is not recoverable, sending fail_init signal and panicking", - request_id - ); - self.runtime_client.fail_init(&ErrorResponse::from(e)); - panic!("Could not send error response"); - } - } + Err(e) => { + error!("Handler returned an error for {}: {}", request_id, e); + debug!("Attempting to send error response to Runtime API for {}", request_id); + Either::B(runtime.runtime_client.event_error(&request_id, &ErrorResponse::from(e)) + .then(move |r| { + match r { + Ok(_) => info!("Error response for {} accepted by Runtime API", request_id), + Err(e) => { + error!("Unable to send error response for {} to Runtime API: {}", request_id, e); + if !e.is_recoverable() { + error!( + "Error for {} is not recoverable, sending fail_init signal and panicking", + request_id + ); + runtime.runtime_client.fail_init(&ErrorResponse::from(e)); + panic!("Could not send error response"); + } + }, + } + Ok(Loop::Continue(runtime)) + })) } - } - } - } + }) + }) + }) } /// Invoke the handler function. This method is split out of the main loop to /// make it testable. - pub(super) fn invoke(&mut self, e: Vec, ctx: Context) -> Result, EventError> { + pub(super) fn invoke(&mut self, e: Vec, ctx: Context) -> Fut { (self.handler).run(e, ctx) } @@ -246,41 +268,47 @@ where /// /// # Return /// The next `Event` object to be processed. - pub(super) fn get_next_event(&self, retries: i8, e: Option) -> (Vec, Context) { - if let Some(err) = e { - if retries > self.max_retries { - error!("Unrecoverable error while fetching next event: {}", err); - match err.request_id.clone() { - Some(req_id) => { - self.runtime_client - .event_error(&req_id, &ErrorResponse::from(err)) - .expect("Could not send event error response"); - } - None => { - self.runtime_client.fail_init(&ErrorResponse::from(err)); - } + pub(super) fn get_next_event(self, retries: i8, e: Option) -> impl Future, Context), Error=()> + Send { + loop_fn((self, retries, e), |(runtime, retries, e)| { + if let Some(err) = e { + if retries > runtime.max_retries { + error!("Unrecoverable error while fetching next event: {}", err); + let future = match err.request_id.clone() { + Some(req_id) => { + Either::A(runtime.runtime_client.event_error(&req_id, &ErrorResponse::from(err)) + .map_err(|_| panic!("Could not send event error response"))) + } + None => { + Either::B(runtime.runtime_client.fail_init(&ErrorResponse::from(err))) + } + }; + // to avoid unreachable code + return Either::A(future.then(|_| Err(())).map_err(|_| { + // these errors are not recoverable. Either we can't communicate with the runtie APIs + // or we cannot parse the event. panic to restart the environment. + panic!("Could not retrieve next event"); + })); } - - // these errors are not recoverable. Either we can't communicate with the runtie APIs - // or we cannot parse the event. panic to restart the environment. - panic!("Could not retrieve next event"); } - } - match self.runtime_client.next_event() { - Ok((ev_data, invocation_ctx)) => { - let mut handler_ctx = Context::new(self.settings.clone()); - handler_ctx.invoked_function_arn = invocation_ctx.invoked_function_arn; - handler_ctx.aws_request_id = invocation_ctx.aws_request_id; - handler_ctx.xray_trace_id = invocation_ctx.xray_trace_id; - handler_ctx.client_context = invocation_ctx.client_context; - handler_ctx.identity = invocation_ctx.identity; - handler_ctx.deadline = invocation_ctx.deadline; + Either::B(runtime.runtime_client.next_event() + .then(move |r| { + match r { + Ok((ev_data, invocation_ctx)) => { + let mut handler_ctx = Context::new(runtime.settings.clone()); + handler_ctx.invoked_function_arn = invocation_ctx.invoked_function_arn; + handler_ctx.aws_request_id = invocation_ctx.aws_request_id; + handler_ctx.xray_trace_id = invocation_ctx.xray_trace_id; + handler_ctx.client_context = invocation_ctx.client_context; + handler_ctx.identity = invocation_ctx.identity; + handler_ctx.deadline = invocation_ctx.deadline; - (ev_data, handler_ctx) - } - Err(e) => self.get_next_event(retries + 1, Option::from(RuntimeError::from(e))), - } + Ok(Loop::Break((runtime, ev_data, handler_ctx))) + }, + Err(e) => Ok(Loop::Continue((runtime, retries + 1, Option::from(RuntimeError::from(e))))), + } + })) + }) } } @@ -299,7 +327,7 @@ pub(crate) mod tests { .get_runtime_api_endpoint() .expect("Could not get runtime endpoint"), None, - None, + // None, ) .expect("Could not initialize client"); let handler = |_e: Vec, _c: context::Context| -> Result, HandlerError> { Ok(b"hello".to_vec()) }; diff --git a/lambda-runtime-errors/Cargo.toml b/lambda-runtime-errors/Cargo.toml index a141187f..8995a012 100644 --- a/lambda-runtime-errors/Cargo.toml +++ b/lambda-runtime-errors/Cargo.toml @@ -18,3 +18,4 @@ lambda_runtime_errors_derive = { path = "../lambda-runtime-errors-derive", versi [dev-dependencies] lambda_runtime_core = { path = "../lambda-runtime-core", version = "^0.1"} +tokio = "^0.1" diff --git a/lambda-runtime/examples/custom_error_failure_future.rs b/lambda-runtime/examples/custom_error_failure_future.rs new file mode 100644 index 00000000..c8a3af6b --- /dev/null +++ b/lambda-runtime/examples/custom_error_failure_future.rs @@ -0,0 +1,55 @@ +use failure::Fail; +use lambda_runtime::{error::LambdaErrorExt, lambda, Context}; +use log::error; +use serde_derive::{Deserialize, Serialize}; +use std::error::Error as StdError; +use tokio::prelude::{future, Future}; + +#[derive(Fail, Debug)] +#[fail(display = "Custom Error")] +struct CustomError; +impl LambdaErrorExt for CustomError { + fn error_type(&self) -> &str { + "CustomError" + } +} +impl From for CustomError { + fn from(_i: std::num::ParseIntError) -> Self { + CustomError {} + } +} + +#[derive(Deserialize)] +struct CustomEvent { + #[serde(rename = "firstName")] + first_name: String, + age: String, +} + +#[derive(Serialize)] +struct CustomOutput { + message: String, +} + +fn main() -> Result<(), Box> { + simple_logger::init_with_level(log::Level::Debug)?; + lambda!(my_handler); + + Ok(()) +} + +fn my_handler(e: CustomEvent, c: Context) -> impl Future { + if e.first_name == "" { + error!("Empty first name in request {}", c.aws_request_id); + return future::err(CustomError {}); + } + + let _age_num: u8 = match e.age.parse() { + Ok(i) => i, + Err(e) => return future::err(e.into()), + }; + + future::ok(CustomOutput { + message: format!("Hello, {}!", e.first_name), + }) +} diff --git a/lambda-runtime/examples/with_custom_runtime.rs b/lambda-runtime/examples/with_custom_runtime.rs index d0e6a0b7..b4986e20 100644 --- a/lambda-runtime/examples/with_custom_runtime.rs +++ b/lambda-runtime/examples/with_custom_runtime.rs @@ -18,7 +18,7 @@ struct CustomOutput { } fn main() -> Result<(), Box> { - let rt = Runtime::new()?; + let mut rt = Runtime::new()?; simple_logger::init_with_level(log::Level::Debug)?; lambda!(my_handler, rt); diff --git a/lambda-runtime/src/lib.rs b/lambda-runtime/src/lib.rs index 2ef78f4e..f3d0b167 100644 --- a/lambda-runtime/src/lib.rs +++ b/lambda-runtime/src/lib.rs @@ -40,9 +40,11 @@ use lambda_runtime_core::{start_with_config, EnvConfigProvider, HandlerError, La use serde; use serde_json; use std::fmt::Display; -use tokio::runtime::Runtime as TokioRuntime; + +pub use tokio; pub use lambda_runtime_core::Context; +use tokio::prelude::future::{self, Future, IntoFuture}; /// The error module exposes the HandlerError type. pub mod error { @@ -50,19 +52,21 @@ pub mod error { } /// Functions acting as a handler must conform to this type. -pub trait Handler { +pub trait Handler: Send { /// Method to execute the handler function - fn run(&mut self, event: Event, ctx: Context) -> Result; + fn run(&mut self, event: Event, ctx: Context) -> Fut; } /// Implementation of the `Handler` trait for both function pointers /// and closures. -impl Handler for Function +impl Handler for Function where - Function: FnMut(Event, Context) -> Result, + Function: FnMut(Event, Context) -> Fut + Send, EventError: Fail + LambdaErrorExt + Display + Send + Sync, + Fut: IntoFuture + Send, + Fut::Future: Send, { - fn run(&mut self, event: Event, ctx: Context) -> Result { + fn run(&mut self, event: Event, ctx: Context) -> Fut { (*self)(event, ctx) } } @@ -71,23 +75,45 @@ where /// defined in the `lambda_runtime_core` crate. The closure simply uses `serde_json` /// to serialize and deserialize the incoming event from a `Vec` and the output /// to a `Vec`. -fn wrap( - mut h: impl Handler, -) -> impl FnMut(Vec, Context) -> Result, HandlerError> +// fn wrap( +// mut h: impl Handler, +// ) -> impl FnMut(Vec, Context) -> Result, HandlerError> +// where +// Event: serde::de::DeserializeOwned, +// Output: serde::Serialize, +// EventError: Fail + LambdaErrorExt + Display + Send + Sync, +// { +// move |ev, ctx| { +// let event: Event = serde_json::from_slice(&ev)?; +// match h.run(event, ctx) { +// Ok(out) => { +// let out_bytes = serde_json::to_vec(&out)?; +// Ok(out_bytes) +// } +// Err(e) => Err(HandlerError::new(e)), +// } +// } +// } +fn wrap( + mut h: impl Handler, +) -> impl FnMut(Vec, Context) -> Box, Error=HandlerError> + Send> where - Event: serde::de::DeserializeOwned, + Event: serde::de::DeserializeOwned + Send, Output: serde::Serialize, EventError: Fail + LambdaErrorExt + Display + Send + Sync, + Fut: IntoFuture + Send, + Fut::Future: Send + 'static, { move |ev, ctx| { - let event: Event = serde_json::from_slice(&ev)?; - match h.run(event, ctx) { - Ok(out) => { - let out_bytes = serde_json::to_vec(&out)?; - Ok(out_bytes) - } + let event: Event = match serde_json::from_slice(&ev) { + Ok(e) => e, + Err(e) => return Box::new(future::err(e.into())), + }; + + Box::new(h.run(event, ctx).into_future().then(|res| match res { + Ok(out) => serde_json::to_vec(&out).map_err(|e| e.into()), Err(e) => Err(HandlerError::new(e)), - } + })) } } @@ -99,14 +125,16 @@ where /// /// # Panics /// The function panics if the Lambda environment variables are not set. -pub fn start(f: impl Handler, runtime: Option) +pub fn start(f: impl Handler) -> impl Future where - Event: serde::de::DeserializeOwned, + Event: serde::de::DeserializeOwned + Send, Output: serde::Serialize, EventError: Fail + LambdaErrorExt + Display + Send + Sync, + Fut: IntoFuture + Send, + Fut::Future: Send + 'static, { let wrapped = wrap(f); - start_with_config(wrapped, &EnvConfigProvider::default(), runtime) + start_with_config(wrapped, &EnvConfigProvider::default()) } /// Initializes the Lambda runtime with the given handler. Optionally this macro can @@ -115,16 +143,16 @@ where #[macro_export] macro_rules! lambda { ($handler:ident) => { - $crate::start($handler, None) + $crate::tokio::run($crate::start($handler)) }; ($handler:ident, $runtime:expr) => { - $crate::start($handler, Some($runtime)) + $runtime.spawn($crate::start($handler)) }; ($handler:expr) => { - $crate::start($handler, None) + $crate::tokio::run($crate::start($handler)) }; ($handler:expr, $runtime:expr) => { - $crate::start($handler, Some($runtime)) + $runtime.spawn($crate::start($handler)) }; } @@ -134,6 +162,7 @@ pub(crate) mod tests { use lambda_runtime_core::Context; use serde_derive::{Deserialize, Serialize}; use serde_json; + use tokio::runtime::current_thread::block_on_all; fn test_context() -> Context { Context { @@ -172,10 +201,10 @@ pub(crate) mod tests { let input = Input { name: "test".to_owned(), }; - let output = wrapped_ok.run( + let output = block_on_all(wrapped_ok.run( serde_json::to_vec(&input).expect("Could not convert input to Vec"), test_context(), - ); + )); assert_eq!( output.is_err(), false, @@ -203,10 +232,10 @@ pub(crate) mod tests { let input = Input { name: "test".to_owned(), }; - let output = wrapped_ok.run( + let output = block_on_all(wrapped_ok.run( serde_json::to_vec(&input).expect("Could not convert input to Vec"), test_context(), - ); + )); assert_eq!(output.is_err(), true, "Handler did not throw an error"); let err = output.err().unwrap(); assert_eq!(