diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 437b86620..4fd001ccb 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -29,6 +29,7 @@ crates_repository( manifests = [ "//modules:Cargo.toml", "//modules/RsIskraMeter:Cargo.toml", + "//modules/RsPaymentTerminal:Cargo.toml", "//modules/rust_examples/RsExample:Cargo.toml", "//modules/rust_examples/RsExampleUser:Cargo.toml", ], diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 4a142cbb9..424825c23 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -36,5 +36,6 @@ add_subdirectory(simulation) if(${EVEREST_ENABLE_RS_SUPPORT}) ev_add_module(RsIskraMeter) + ev_add_module(RsPaymentTerminal) add_subdirectory(rust_examples) endif() diff --git a/modules/Cargo.lock b/modules/Cargo.lock index 6cfc3ecf4..baf12e1ca 100644 --- a/modules/Cargo.lock +++ b/modules/Cargo.lock @@ -32,11 +32,41 @@ dependencies = [ "everestrs", "everestrs-build", "log", - "mockall", + "mockall 0.12.1", "mockall_double", "rand", ] +[[package]] +name = "RsPaymentTerminal" +version = "0.1.0" +dependencies = [ + "anyhow", + "env_logger", + "everestrs", + "everestrs-build", + "log", + "mockall 0.12.1", + "mockall_double", + "tokio", + "zvt_feig_terminal", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" version = "1.1.2" @@ -92,7 +122,7 @@ dependencies = [ "argh_shared", "proc-macro2", "quote", - "syn", + "syn 2.0.53", ] [[package]] @@ -104,18 +134,129 @@ dependencies = [ "serde", ] +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "async-trait" +version = "0.1.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bumpalo" version = "3.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + [[package]] name = "cc" version = "1.0.83" @@ -142,7 +283,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets", + "windows-targets 0.52.4", ] [[package]] @@ -186,15 +327,60 @@ checksum = "587663dd5fb3d10932c8aecfe7c844db1bcf0aee93eeab08fac13dc1212c2e7f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.53", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", ] +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "downcast" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + +[[package]] +name = "enum-as-inner" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "env_logger" version = "0.10.2" @@ -217,7 +403,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "everestrs" version = "0.1.0" -source = "git+https://github.com/everest/everest-framework.git?rev=01468678f5b627a96791f749f3139c3d169bf081#01468678f5b627a96791f749f3139c3d169bf081" +source = "git+https://github.com/everest/everest-framework.git?rev=cb6bf68d68d6c1fbe8ede1f1c5abe951a0507cc2#cb6bf68d68d6c1fbe8ede1f1c5abe951a0507cc2" dependencies = [ "argh", "cxx", @@ -231,7 +417,7 @@ dependencies = [ [[package]] name = "everestrs-build" version = "0.1.0" -source = "git+https://github.com/everest/everest-framework.git?rev=01468678f5b627a96791f749f3139c3d169bf081#01468678f5b627a96791f749f3139c3d169bf081" +source = "git+https://github.com/everest/everest-framework.git?rev=cb6bf68d68d6c1fbe8ede1f1c5abe951a0507cc2#cb6bf68d68d6c1fbe8ede1f1c5abe951a0507cc2" dependencies = [ "anyhow", "argh", @@ -242,12 +428,125 @@ dependencies = [ "serde_yaml", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "fragile" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "getrandom" version = "0.2.12" @@ -259,24 +558,137 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "h2" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.1.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "hyper" +version = "0.14.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -300,6 +712,36 @@ dependencies = [ "cc", ] +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + [[package]] name = "indexmap" version = "2.1.0" @@ -307,9 +749,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.3", ] +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "is-terminal" version = "0.4.12" @@ -318,7 +766,16 @@ checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ "hermit-abi", "libc", - "windows-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", ] [[package]] @@ -363,12 +820,24 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minijinja" version = "1.0.10" @@ -378,31 +847,78 @@ dependencies = [ "serde", ] +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "mockall" -version = "0.12.1" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43766c2b5203b10de348ffe19f7e54564b64f3d6018ff7648d1e2d6d3a0f0a48" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" dependencies = [ "cfg-if", "downcast", "fragile", "lazy_static", - "mockall_derive", - "predicates", + "mockall_derive 0.11.4", + "predicates 2.1.5", "predicates-tree", ] [[package]] -name = "mockall_derive" +name = "mockall" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cbce79ec385a1d4f54baa90a76401eb15d9cab93685f62e7e9f942aa00ae2" +checksum = "43766c2b5203b10de348ffe19f7e54564b64f3d6018ff7648d1e2d6d3a0f0a48" dependencies = [ "cfg-if", - "proc-macro2", - "quote", - "syn", + "downcast", + "fragile", + "lazy_static", + "mockall_derive 0.12.1", + "predicates 3.1.0", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "mockall_derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af7cbce79ec385a1d4f54baa90a76401eb15d9cab93685f62e7e9f942aa00ae2" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 2.0.53", ] [[package]] @@ -414,7 +930,39 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn", + "syn 2.0.53", +] + +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", ] [[package]] @@ -426,18 +974,95 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + [[package]] name = "predicates" version = "3.1.0" @@ -464,24 +1089,63 @@ dependencies = [ "termtree", ] +[[package]] +name = "pretty-hex" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc83ee4a840062f368f9096d80077a9841ec117e17e7f700df81958f1451254" + [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + [[package]] name = "rand" version = "0.8.5" @@ -541,6 +1205,18 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.15" @@ -564,7 +1240,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.53", ] [[package]] @@ -584,24 +1260,66 @@ version = "0.9.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" dependencies = [ - "indexmap", + "indexmap 2.1.0", "itoa", "ryu", "serde", "unsafe-libyaml", ] +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" + +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "syn" -version = "2.0.39" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "termcolor" version = "1.4.1" @@ -634,15 +1352,293 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.53", +] + +[[package]] +name = "time" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "prost-derive", + "tokio", + "tokio-stream", + "tokio-util", + "tower", + "tower-layer", + "tower-service", + "tracing", + "tracing-futures", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", ] +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "trust-dns-client" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14135e72c7e6d4c9b6902d4437881a8598f0145dbb2e3f86f92dbad845b61e63" +dependencies = [ + "cfg-if", + "data-encoding", + "futures-channel", + "futures-util", + "once_cell", + "radix_trie", + "rand", + "thiserror", + "tokio", + "tracing", + "trust-dns-proto", +] + +[[package]] +name = "trust-dns-proto" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3119112651c157f4488931a01e586aa459736e9d6046d3bd9105ffb69352d374" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.4.0", + "ipnet", + "once_cell", + "rand", + "smallvec", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.10.1" @@ -655,6 +1651,26 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna 0.5.0", + "percent-encoding", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -682,7 +1698,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.53", "wasm-bindgen-shared", ] @@ -704,7 +1720,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -752,7 +1768,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", ] [[package]] @@ -761,7 +1786,22 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -770,53 +1810,173 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + +[[package]] +name = "yore" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f58c7ce1b7faa85a5c5a8b45b428c89cabdcd097bb472b7668037b291a8a20b" +dependencies = [ + "thiserror", +] + +[[package]] +name = "zvt" +version = "0.1.1" +source = "git+https://github.com/Qwello/zvt.git?rev=843ecf44ab592216bd4a483a07543c329d2baee1#843ecf44ab592216bd4a483a07543c329d2baee1" +dependencies = [ + "anyhow", + "async-stream", + "chrono", + "futures", + "log", + "num-derive", + "num-traits", + "pretty-hex", + "tokio", + "tokio-stream", + "zvt_builder", + "zvt_derive", +] + +[[package]] +name = "zvt_builder" +version = "0.1.1" +source = "git+https://github.com/Qwello/zvt.git?rev=843ecf44ab592216bd4a483a07543c329d2baee1#843ecf44ab592216bd4a483a07543c329d2baee1" +dependencies = [ + "chrono", + "hex", + "log", + "thiserror", + "yore", + "zvt_derive", +] + +[[package]] +name = "zvt_derive" +version = "0.1.1" +source = "git+https://github.com/Qwello/zvt.git?rev=843ecf44ab592216bd4a483a07543c329d2baee1#843ecf44ab592216bd4a483a07543c329d2baee1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "zvt_feig_terminal" +version = "0.1.0" +source = "git+https://github.com/Qwello/zvt.git?rev=843ecf44ab592216bd4a483a07543c329d2baee1#843ecf44ab592216bd4a483a07543c329d2baee1" +dependencies = [ + "anyhow", + "async-stream", + "async-trait", + "env_logger", + "futures", + "log", + "mockall 0.11.4", + "mockall_double", + "num-traits", + "pin-project", + "serde", + "thiserror", + "time", + "time-macros", + "tokio", + "tokio-stream", + "tonic", + "trust-dns-client", + "trust-dns-proto", + "zvt", +] diff --git a/modules/Cargo.toml b/modules/Cargo.toml index 740fc7156..632ac35fc 100644 --- a/modules/Cargo.toml +++ b/modules/Cargo.toml @@ -2,10 +2,11 @@ resolver = "2" members = [ "RsIskraMeter", + "RsPaymentTerminal", "rust_examples/RsExample", "rust_examples/RsExampleUser", ] [workspace.dependencies] -everestrs = { git = "https://github.com/everest/everest-framework.git", rev = "01468678f5b627a96791f749f3139c3d169bf081" } -everestrs-build = { git = "https://github.com/everest/everest-framework.git", rev = "01468678f5b627a96791f749f3139c3d169bf081" } +everestrs = { git = "https://github.com/everest/everest-framework.git", rev = "cb6bf68d68d6c1fbe8ede1f1c5abe951a0507cc2" } +everestrs-build = { git = "https://github.com/everest/everest-framework.git", rev = "cb6bf68d68d6c1fbe8ede1f1c5abe951a0507cc2" } diff --git a/modules/RsPaymentTerminal/BUILD.bazel b/modules/RsPaymentTerminal/BUILD.bazel new file mode 100644 index 000000000..17e732e2d --- /dev/null +++ b/modules/RsPaymentTerminal/BUILD.bazel @@ -0,0 +1,63 @@ +load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_test") +load("@crate_index//:defs.bzl", "all_crate_deps") +load("@rules_rust//cargo:defs.bzl", "cargo_build_script") + +cargo_build_script( + name = "build_script", + srcs = ["build.rs"], + edition="2021", + build_script_env = { + "EVEREST_CORE_ROOT": "../..", + }, + data = [ + "manifest.yaml", + "@everest-core//:interfaces", + "@everest-core//:types", + ], + deps = all_crate_deps(build = True), +) + +rust_binary( + name = "RsPaymentTerminalBinary", + srcs = glob(["src/*.rs"]), + edition="2021", + proc_macro_deps = all_crate_deps(proc_macro = True), + visibility = ["//visibility:public"], + deps = all_crate_deps(normal = True) + [ + ":build_script", + "@everest-framework//everestrs/everestrs:everestrs_sys", + "@everest-framework//everestrs/everestrs:everestrs_bridge", + ], +) + +rust_test( + name = "RsPaymentTerminalTest", + edition="2021", + srcs = [], + crate_features = ["mockall", "mockall_double"], + crate = ":RsPaymentTerminalBinary", +) + +binary = ":RsPaymentTerminalBinary" +manifest = ":manifest.yaml" +name = "RsPaymentTerminal" + +genrule( + name = "copy_to_subdir", + srcs = [binary, manifest], + outs = [ + "{}/manifest.yaml".format(name), + "{}/{}".format(name, name), + ], + cmd = "mkdir -p $(RULEDIR)/{} && ".format(name) + + "cp $(location {}) $(RULEDIR)/{}/{} && ".format(binary, name, name) + + "cp $(location {}) $(RULEDIR)/{}/".format(manifest, name), +) + +filegroup( + name = name, + srcs = [ + ":copy_to_subdir", + ], + visibility = ["//visibility:public"], +) diff --git a/modules/RsPaymentTerminal/Cargo.toml b/modules/RsPaymentTerminal/Cargo.toml new file mode 100644 index 000000000..3028a4b31 --- /dev/null +++ b/modules/RsPaymentTerminal/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "RsPaymentTerminal" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +everestrs = { workspace=true } +anyhow = "1.0.75" +zvt_feig_terminal = { git="https://github.com/Qwello/zvt.git", rev="843ecf44ab592216bd4a483a07543c329d2baee1" } +tokio = { version = "1.32.0", features = ["macros", "rt-multi-thread", "net", "sync"] } +log = "0.4.20" +env_logger = "0.10.0" +mockall = { version = "0.12.1", optional = true } +mockall_double = { version = "0.3.1", optional = true} + +[build-dependencies] +everestrs-build = { workspace=true } + +[features] +default = ["mockall", "mockall_double"] diff --git a/modules/RsPaymentTerminal/build.rs b/modules/RsPaymentTerminal/build.rs new file mode 100644 index 000000000..8427ecfd3 --- /dev/null +++ b/modules/RsPaymentTerminal/build.rs @@ -0,0 +1,13 @@ +use everestrs_build::Builder; + +pub fn main() { + Builder::new( + "manifest.yaml", + vec![std::env::var("EVEREST_CORE_ROOT").unwrap()], + ) + .generate() + .unwrap(); + + println!("cargo:rerun-if-changed=build.rs"); + println!("cargo:rerun-if-changed=manifest.yaml"); +} diff --git a/modules/RsPaymentTerminal/manifest.yaml b/modules/RsPaymentTerminal/manifest.yaml new file mode 100644 index 000000000..2ea6acb74 --- /dev/null +++ b/modules/RsPaymentTerminal/manifest.yaml @@ -0,0 +1,61 @@ +description: Payment terminal module +config: + ip: + description: IP Address of Feig terminal + default: "0.0.0.0" + type: string + feig_serial: + description: Serial of Feig device + default: "ABCD123" + type: string + terminal_id: + description: Payment terminal ID + default: "12345678" + type: string + currency: + description: Currency in ISO 4217 format + default: 978 + type: integer + pre_authorization_amount: + description: Pre authentication amount in Cents. + default: 2500 + type: integer + read_card_timeout: + description: The time (is seconds) to wait for a card to be read. + default: 2 + type: integer + read_card_debounce: + description: >- + The debounce time (in seconds) after a successful card reading. The + parameter prevents re-reading the same card. + default: 2 + type: integer + transactions_max_num: + description: >- + The maximum number of concurrent transactions. The payment terminal will + reject a transaction if it would exceed the maximum number of concurrent + transactions - in this case you need to finish a transaction to allow a + new one + default: 1 + type: integer + password: + description: Password for the feig terminal. + type: integer + default: 0 +requires: + session: + interface: session_cost + bank_session_token: + interface: bank_session_token_provider +provides: + token_provider: + interface: auth_token_provider + description: Provides an authentication token from the payment terminal + bank_transaction_summary: + interface: bank_transaction_summary_provider + description: Provides details of an already processed payment +enable_external_mqtt: false +metadata: + license: https://opensource.org/licenses/Apache-2.0 + authors: + - embedded-team@qwello.eu diff --git a/modules/RsPaymentTerminal/src/logger.rs b/modules/RsPaymentTerminal/src/logger.rs new file mode 100644 index 000000000..9e62550e5 --- /dev/null +++ b/modules/RsPaymentTerminal/src/logger.rs @@ -0,0 +1,47 @@ +use env_logger::{Builder, Env}; +use everestrs::serde as everest_serde; +use std::io::Write; + +#[derive(everest_serde::Serialize)] +#[serde(crate = "everest_serde", rename_all = "UPPERCASE")] +struct Entry<'a> { + code_file: &'a str, + code_line: u32, + message: &'a str, +} + +/// Initializes the logging. +/// +/// # Arguments +/// * `env_var` - The environment variable defining the minimal logging +/// severity. Must be one of `trace`, `debug`, `info`, `warn` or `error`. If +/// the environment variable is not set, the default severity will be `info`. +pub fn init_logger(env_var: &str) { + let env = Env::default().filter_or(env_var, "info"); + + Builder::from_env(env) + .format(|buf, record| { + let message = &record.args().to_string(); + + let entry = Entry { + code_file: record.file().unwrap_or("unknown"), + code_line: record.line().unwrap_or(0), + message, + }; + + writeln!( + buf, + "<{}>{}", + match record.level() { + log::Level::Error => 3, + log::Level::Warn => 4, + log::Level::Info => 6, + log::Level::Debug => 7, + log::Level::Trace => 7, + }, + everestrs::serde_json::to_string(&entry) + .unwrap_or("Failed to format the log message".to_string()), + ) + }) + .init(); +} diff --git a/modules/RsPaymentTerminal/src/main.rs b/modules/RsPaymentTerminal/src/main.rs new file mode 100644 index 000000000..9106f6ffb --- /dev/null +++ b/modules/RsPaymentTerminal/src/main.rs @@ -0,0 +1,536 @@ +#![allow(non_snake_case, non_camel_case_types, clippy::all)] +include!(concat!(env!("OUT_DIR"), "/generated.rs")); + +mod logger; +use anyhow::Result; +use generated::types::{ + authorization::{AuthorizationType, IdToken, IdTokenType, ProvidedIdToken}, + bank_transaction::{BankSessionToken, BankTransactionSummary}, + money::MoneyAmount, + session_cost::{SessionCost, SessionStatus}, +}; +use generated::{ + get_config, AuthTokenProviderServiceSubscriber, BankSessionTokenProviderClientSubscriber, + BankTransactionSummaryProviderServiceSubscriber, Context, Module, ModulePublisher, + OnReadySubscriber, SessionCostClientSubscriber, +}; +use std::sync::{mpsc::channel, mpsc::Sender, Arc}; +use std::time::Duration; +use std::{net::Ipv4Addr, str::FromStr}; +use zvt_feig_terminal::config::{Config, FeigConfig}; +use zvt_feig_terminal::feig::{CardInfo, Error}; + +mod sync_feig { + use anyhow::Result; + use zvt_feig_terminal::{ + config::Config, + feig::{CardInfo, Feig, TransactionSummary}, + }; + + pub struct SyncFeig { + /// Tokio runtime to call the feig functions. + rt: tokio::runtime::Runtime, + + /// The async impl of the Feig. + inner: std::sync::Mutex, + } + + /// Sync interface for the Feig. + /// + /// The `Feig` implements an async interface, which we can't use in EVerest. + /// Here we wrap the async functions and expose the sync version of them. + /// + /// Below we allow `dead_code` so we just wrap all async functions even + /// though they may be unused. + #[allow(dead_code)] + #[cfg_attr(test, mockall::automock)] + impl SyncFeig { + pub fn new(config: Config) -> Self { + // Create a runtime for the feig terminal. + let rt = tokio::runtime::Builder::new_multi_thread() + .max_blocking_threads(1) + .enable_all() + .build() + .unwrap(); + + // Create the feig terminal itself. + let feig = rt.block_on(async { + loop { + let response = Feig::new(config.clone()).await; + match response { + Ok(inner) => { + log::info!("Payment terminal initialized."); + return inner; + } + Err(e) => { + log::warn!("Payment terminal not initialized {:?}", e); + } + } + } + }); + + Self { + rt, + inner: std::sync::Mutex::new(feig), + } + } + + pub fn read_card(&self) -> Result { + let mut inner = self.inner.lock().unwrap(); + self.rt.block_on(inner.read_card()) + } + + pub fn begin_transaction(&self, token: &str) -> Result<()> { + let mut inner = self.inner.lock().unwrap(); + self.rt.block_on(inner.begin_transaction(token)) + } + + pub fn cancel_transaction(&self, token: &str) -> Result<()> { + let mut inner = self.inner.lock().unwrap(); + self.rt.block_on(inner.cancel_transaction(token)) + } + + pub fn commit_transaction(&self, token: &str, amount: u64) -> Result { + let mut inner = self.inner.lock().unwrap(); + self.rt.block_on(inner.commit_transaction(token, amount)) + } + } +} + +#[mockall_double::double] +use sync_feig::SyncFeig; + +impl ProvidedIdToken { + fn new(id_token: String, authorization_type: AuthorizationType) -> Self { + Self { + parent_id_token: None, + id_token: IdToken { + value: id_token, + r#type: IdTokenType::Local, + }, + authorization_type, + certificate: None, + connectors: None, + iso_15118_certificate_hash_data: None, + prevalidated: None, + request_id: None, + } + } +} + +/// Main struct for this module. +pub struct PaymentTerminalModule { + /// Sender for the `ModulePublisher` -> to get the publisher from `on_ready` + /// into the main thread. + tx: Sender, + + /// The feig interface. + feig: SyncFeig, +} + +impl PaymentTerminalModule { + /// Waits for a card and begins a transaction (sends an auth token). + /// + /// In case of a bank card we start the transaction on the payment terminal. + /// In case of membership cards we just issue the token. In both cases we + /// don't flag the token as pre-validated to allow the consumers to add + /// custom validation steps on top. + fn begin_transaction(&self, publishers: &ModulePublisher) -> Result<()> { + // Get a valid invoice token. + let invoice_token = publishers.bank_session_token.get_bank_session_token()?; + let token = invoice_token + .token + .ok_or(anyhow::anyhow!("No token received"))?; + log::info!("Received the BankSessionToken {token}"); + + // Wait for the card. + let read_card_loop = || -> Result { + loop { + match self.feig.read_card() { + Ok(card_info) => return Ok(card_info), + Err(e) => match e.downcast_ref::() { + Some(Error::NoCardPresented) => { + log::debug!("No card presented"); + continue; + } + _ => return Err(anyhow::anyhow!("Failed to read card: {e:?}")), + }, + }; + } + }; + let card_info = read_card_loop()?; + + let provided_token = match card_info { + CardInfo::Bank => { + self.feig.begin_transaction(&token)?; + + // Reuse the bank token as invoice token so we can use the + // invoice token later on to commit our transactions. + ProvidedIdToken::new(token, AuthorizationType::BankCard) + } + CardInfo::MembershipCard(id_token) => { + ProvidedIdToken::new(id_token, AuthorizationType::RFID) + } + }; + publishers.token_provider.provided_token(provided_token)?; + Ok(()) + } + + /// The implementation of the `SessionCostClientSubscriber::on_session_cost`, + /// but here we can return errors. + fn on_session_cost_impl(&self, context: &Context, value: SessionCost) -> Result<()> { + // We only care about bank cards. + match value.id_tag.authorization_type { + AuthorizationType::BankCard => (), + _ => return Ok(()), + } + + if let SessionStatus::Running = value.status { + log::info!("The session is still running"); + return Ok(()); + } + + let total_cost = value + .cost_chunks + .unwrap_or_default() + .into_iter() + .fold(0, |acc, chunk| { + acc + chunk.cost.unwrap_or(MoneyAmount { value: 0 }).value + }); + + let res = self + .feig + .commit_transaction(&value.id_tag.id_token.value, total_cost as u64)?; + + context + .publisher + .bank_transaction_summary + .bank_transaction_summary(BankTransactionSummary { + session_token: Some(BankSessionToken { + token: Some(value.id_tag.id_token.value.clone()), + }), + transaction_data: Some(format!("{:06}", res.trace_number.unwrap_or_default())), + })?; + Ok(()) + } +} + +impl AuthTokenProviderServiceSubscriber for PaymentTerminalModule {} + +impl BankTransactionSummaryProviderServiceSubscriber for PaymentTerminalModule {} + +impl BankSessionTokenProviderClientSubscriber for PaymentTerminalModule {} + +impl OnReadySubscriber for PaymentTerminalModule { + fn on_ready(&self, publishers: &ModulePublisher) { + // Send the publishers to the main thread. + self.tx.send(publishers.clone()).unwrap(); + } +} + +impl SessionCostClientSubscriber for PaymentTerminalModule { + fn on_session_cost(&self, context: &Context, value: SessionCost) { + let res = self.on_session_cost_impl(context, value); + match res { + Ok(_) => log::debug!("Transaction successful"), + Err(err) => log::error!("Transaction failed {err:}"), + } + } +} + +impl PaymentTerminalModule {} + +fn main() -> Result<()> { + logger::init_logger("RS_PAYMENT_TERMINAL_LOGGER_LEVEL"); + let config = get_config(); + log::info!("Received the config {config:?}"); + + let pt_config = Config { + terminal_id: config.terminal_id, + feig_serial: config.feig_serial, + ip_address: Ipv4Addr::from_str(&config.ip)?, + feig_config: FeigConfig { + currency: config.currency as usize, + pre_authorization_amount: config.pre_authorization_amount as usize, + read_card_timeout: config.read_card_timeout as u8, + password: config.password as usize, + }, + transactions_max_num: config.transactions_max_num as usize, + }; + + let (tx, rx) = channel(); + + let pt_module = Arc::new(PaymentTerminalModule { + tx, + feig: SyncFeig::new(pt_config), + }); + + let _module = Module::new( + pt_module.clone(), + pt_module.clone(), + pt_module.clone(), + pt_module.clone(), + pt_module.clone(), + ); + + let read_card_debounce = Duration::from_secs(config.read_card_debounce as u64); + let publishers = rx.recv()?; + loop { + log::debug!("Waiting for transactions..."); + let res = pt_module.begin_transaction(&publishers); + match res { + Ok(()) => { + log::info!("Started a transaction"); + std::thread::sleep(read_card_debounce); + } + Err(err) => log::error!("Failed to start a transaction {err:?}"), + } + } +} + +#[cfg(test)] +mod tests { + use self::generated::types::money::Currency; + use self::generated::types::money::CurrencyCode; + use self::generated::types::session_cost::SessionCostChunk; + + use super::*; + use mockall::predicate::eq; + use zvt_feig_terminal::feig::TransactionSummary; + + #[test] + /// Unit tests for the `PaymentTerminalModule::begin_transaction`. + fn payment_terminal_module__begin_transaction() { + // Test first the case where we don't receive token. + let parameters = [ + Err(::everestrs::Error::InvalidArgument("oh no")), + Ok(BankSessionToken { token: None }), + ]; + + for input in parameters { + let mut everest_mock = ModulePublisher::default(); + everest_mock + .bank_session_token + .expect_get_bank_session_token() + .times(1) + .return_once(|| input); + + let feig = SyncFeig::default(); + let (tx, _) = channel(); + + let pt_module = PaymentTerminalModule { tx, feig }; + + assert!(pt_module.begin_transaction(&everest_mock).is_err()); + } + + // Now test the successful execution. + let parameters = [ + (CardInfo::Bank, "my bank token", true), + ( + CardInfo::MembershipCard("my membership token".to_string()), + "my membership token", + false, + ), + ]; + + for (card_info, expected_token, expected_transaction) in parameters { + let mut everest_mock = ModulePublisher::default(); + let mut feig_mock = SyncFeig::default(); + + everest_mock + .bank_session_token + .expect_get_bank_session_token() + .times(1) + .return_once(|| { + Ok(BankSessionToken { + token: Some("my bank token".to_string()), + }) + }); + + everest_mock + .token_provider + .expect_provided_token() + .times(1) + .withf(|arg| arg.id_token.value == expected_token.to_string()) + .return_once(|_| Ok(())); + + feig_mock + .expect_read_card() + .times(1) + .return_once(|| Ok(card_info)); + + if expected_transaction { + feig_mock + .expect_begin_transaction() + .times(1) + .with(eq("my bank token")) + .return_once(|_| Ok(())); + } + + let (tx, _) = channel(); + + let pt_module = PaymentTerminalModule { + tx, + feig: feig_mock, + }; + + assert!(pt_module.begin_transaction(&everest_mock).is_ok()); + } + } + + #[test] + /// We test that we don't commit anything for inputs which should be ignored. + fn payment_terminal__on_session_cost_impl__noop() { + let parameters = [ + SessionCost { + cost_chunks: None, + currency: Currency { + code: CurrencyCode::EUR, + decimals: None, + }, + id_tag: ProvidedIdToken::new(String::new(), AuthorizationType::OCPP), + status: SessionStatus::Finished, + }, + SessionCost { + cost_chunks: None, + currency: Currency { + code: CurrencyCode::EUR, + decimals: None, + }, + id_tag: ProvidedIdToken::new(String::new(), AuthorizationType::RFID), + status: SessionStatus::Finished, + }, + SessionCost { + cost_chunks: None, + currency: Currency { + code: CurrencyCode::EUR, + decimals: None, + }, + id_tag: ProvidedIdToken::new(String::new(), AuthorizationType::BankCard), + status: SessionStatus::Running, + }, + ]; + + for session_cost in parameters { + let everest_mock = ModulePublisher::default(); + let context = Context { + name: "foo", + publisher: &everest_mock, + }; + let feig = SyncFeig::default(); + let (tx, _) = channel(); + + let pt_module = PaymentTerminalModule { tx, feig }; + assert!(pt_module + .on_session_cost_impl(&context, session_cost) + .is_ok()); + } + } + + #[test] + /// We test that we commit the right amount for transactions which are for + /// us. + fn payment_terminal__on_session_cost_impl() { + let parameters = [ + ( + SessionCost { + cost_chunks: None, + currency: Currency { + code: CurrencyCode::EUR, + decimals: None, + }, + id_tag: ProvidedIdToken::new("token".to_string(), AuthorizationType::BankCard), + status: SessionStatus::Finished, + }, + 0, + ), + ( + SessionCost { + cost_chunks: Some(Vec::new()), + currency: Currency { + code: CurrencyCode::EUR, + decimals: None, + }, + id_tag: ProvidedIdToken::new("token".to_string(), AuthorizationType::BankCard), + status: SessionStatus::Finished, + }, + 0, + ), + ( + SessionCost { + cost_chunks: Some(vec![SessionCostChunk { + category: None, + cost: None, + timestamp_from: None, + timestamp_to: None, + }]), + currency: Currency { + code: CurrencyCode::EUR, + decimals: None, + }, + id_tag: ProvidedIdToken::new("token".to_string(), AuthorizationType::BankCard), + status: SessionStatus::Finished, + }, + 0, + ), + ( + SessionCost { + cost_chunks: Some(vec![ + SessionCostChunk { + category: None, + cost: Some(MoneyAmount { value: 1 }), + timestamp_from: None, + timestamp_to: None, + }, + SessionCostChunk { + category: None, + cost: Some(MoneyAmount { value: 2 }), + timestamp_from: None, + timestamp_to: None, + }, + ]), + currency: Currency { + code: CurrencyCode::EUR, + decimals: None, + }, + id_tag: ProvidedIdToken::new("token".to_string(), AuthorizationType::BankCard), + status: SessionStatus::Finished, + }, + 3, + ), + ]; + + for (session_cost, amount) in parameters { + let mut everest_mock = ModulePublisher::default(); + everest_mock + .bank_transaction_summary + .expect_bank_transaction_summary() + .times(1) + .returning(|_| Ok(())); + + let context = Context { + name: "foo", + publisher: &everest_mock, + }; + let mut feig = SyncFeig::default(); + feig.expect_commit_transaction() + .times(1) + .with(eq("token"), eq(amount)) + .returning(|_, _| { + Ok(TransactionSummary { + terminal_id: None, + amount: None, + trace_number: None, + date: None, + time: None, + }) + }); + let (tx, _) = channel(); + + let pt_module = PaymentTerminalModule { tx, feig }; + assert!(pt_module + .on_session_cost_impl(&context, session_cost) + .is_ok()); + } + } +} diff --git a/types/money.yaml b/types/money.yaml index dd6104c4b..37b781dd1 100644 --- a/types/money.yaml +++ b/types/money.yaml @@ -11,7 +11,6 @@ types: type: string minLength: 3 maxLength: 3 - example: EUR enum: # 784, UAE Dirham, UNITED ARAB EMIRATES (THE) - AED diff --git a/types/session_cost.yaml b/types/session_cost.yaml index f2873e0bd..e8aeb91b3 100644 --- a/types/session_cost.yaml +++ b/types/session_cost.yaml @@ -69,7 +69,6 @@ types: description: One chunk of the session cost type: object $ref: /session_cost#/SessionCostChunk - default: [] status: description: >- Session status. Session can be running or finished. Costs of the