diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..dcba16d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +debug/ +target/ + +.github/ +.idea/ +.vscode/ \ No newline at end of file diff --git a/.github/workflows/dev.prettier.yml b/.github/workflows/dev.build.yml similarity index 94% rename from .github/workflows/dev.prettier.yml rename to .github/workflows/dev.build.yml index 8d00193..482b1f7 100644 --- a/.github/workflows/dev.prettier.yml +++ b/.github/workflows/dev.build.yml @@ -32,5 +32,5 @@ jobs: - name: Build and push Docker image run: | - docker build --pull --build-arg COM_SHA=${{ env.SHORT_SHA }} -t ${{ env.REGISTRY }}/${{ github.repository }}:${{ env.SHORT_SHA }} . + docker build --pull --build-arg COM_SHA=${{ env.SHORT_SHA }} -t ${{ env.REGISTRY }}/${{ github.repository }}:${{ env.SHORT_SHA }} -f ./datafeed-cache-server/Dockerfile . docker push ${{ env.REGISTRY }}/${{ github.repository }}:${{ env.SHORT_SHA }} \ No newline at end of file diff --git a/.github/workflows/prod.docker.yml b/.github/workflows/prod.build.yml similarity index 89% rename from .github/workflows/prod.docker.yml rename to .github/workflows/prod.build.yml index 3ce105a..4977f2f 100644 --- a/.github/workflows/prod.docker.yml +++ b/.github/workflows/prod.build.yml @@ -32,5 +32,5 @@ jobs: - name: Build and push Docker image run: | - docker build --pull --build-arg COM_SHA=${{ env.SHORT_SHA }} -t ${{ env.REGISTRY }}/${{ github.repository }}:latest . + docker build --pull --build-arg COM_SHA=${{ env.SHORT_SHA }} -t ${{ env.REGISTRY }}/${{ github.repository }}:latest -f ./datafeed-cache-server/Dockerfile . docker push ${{ env.REGISTRY }}/${{ github.repository }}:latest \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index b89a8a2..8c72fcf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,54 +8,54 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags", - "bytes", - "futures-core", - "futures-sink", - "memchr", - "pin-project-lite", - "tokio", - "tokio-util", - "tracing", + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", ] [[package]] name = "actix-http" -version = "3.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa882656b67966045e4152c634051e70346939fced7117d5f0b52146a7c74c9" -dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "base64", - "bitflags", - "brotli", - "bytes", - "bytestring", - "derive_more", - "encoding_rs", - "flate2", - "foldhash", - "futures-core", - "h2 0.3.26", - "http 0.2.12", - "httparse", - "httpdate", - "itoa", - "language-tags", - "local-channel", - "mime", - "percent-encoding", - "pin-project-lite", - "rand", - "sha1", - "smallvec", - "tokio", - "tokio-util", - "tracing", - "zstd", +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "base64", + "bitflags", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "foldhash", + "futures-core", + "h2 0.3.26", + "http 0.2.12", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd", ] [[package]] @@ -64,8 +64,8 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ - "quote", - "syn", + "quote", + "syn", ] [[package]] @@ -74,13 +74,13 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" dependencies = [ - "bytestring", - "cfg-if", - "http 0.2.12", - "regex", - "regex-lite", - "serde", - "tracing", + "bytestring", + "cfg-if", + "http 0.2.12", + "regex", + "regex-lite", + "serde", + "tracing", ] [[package]] @@ -89,25 +89,25 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" dependencies = [ - "futures-core", - "tokio", + "futures-core", + "tokio", ] [[package]] name = "actix-server" -version = "2.5.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6398974fd4284f4768af07965701efbbb5fdc0616bff20cade1bb14b77675e24" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" dependencies = [ - "actix-rt", - "actix-service", - "actix-utils", - "futures-core", - "futures-util", - "mio", - "socket2", - "tokio", - "tracing", + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2", + "tokio", + "tracing", ] [[package]] @@ -116,8 +116,8 @@ version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" dependencies = [ - "futures-core", - "pin-project-lite", + "futures-core", + "pin-project-lite", ] [[package]] @@ -126,51 +126,51 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" dependencies = [ - "local-waker", - "pin-project-lite", + "local-waker", + "pin-project-lite", ] [[package]] name = "actix-web" -version = "4.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2e3b15b3dc6c6ed996e4032389e9849d4ab002b1e92fbfe85b5f307d1479b4d" -dependencies = [ - "actix-codec", - "actix-http", - "actix-macros", - "actix-router", - "actix-rt", - "actix-server", - "actix-service", - "actix-utils", - "actix-web-codegen", - "bytes", - "bytestring", - "cfg-if", - "cookie", - "derive_more", - "encoding_rs", - "foldhash", - "futures-core", - "futures-util", - "impl-more", - "itoa", - "language-tags", - "log", - "mime", - "once_cell", - "pin-project-lite", - "regex", - "regex-lite", - "serde", - "serde_json", - "serde_urlencoded", - "smallvec", - "socket2", - "time", - "tracing", - "url", +version = "4.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more", + "encoding_rs", + "foldhash", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "regex-lite", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "tracing", + "url", ] [[package]] @@ -179,10 +179,10 @@ version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" dependencies = [ - "actix-router", - "proc-macro2", - "quote", - "syn", + "actix-router", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -191,7 +191,7 @@ version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "gimli", + "gimli", ] [[package]] @@ -206,7 +206,7 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ - "memchr", + "memchr", ] [[package]] @@ -221,7 +221,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" dependencies = [ - "alloc-no-stdlib", + "alloc-no-stdlib", ] [[package]] @@ -242,7 +242,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "libc", + "libc", ] [[package]] @@ -251,13 +251,13 @@ version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", ] [[package]] @@ -272,7 +272,7 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ - "utf8parse", + "utf8parse", ] [[package]] @@ -281,7 +281,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.59.0", ] [[package]] @@ -290,9 +290,9 @@ version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ - "anstyle", - "once_cell", - "windows-sys 0.59.0", + "anstyle", + "once_cell", + "windows-sys 0.59.0", ] [[package]] @@ -301,7 +301,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" dependencies = [ - "num-traits", + "num-traits", ] [[package]] @@ -318,17 +318,17 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -339,9 +339,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "block-buffer" @@ -349,28 +349,28 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array", + "generic-array", ] [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", ] [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", + "alloc-no-stdlib", + "alloc-stdlib", ] [[package]] @@ -397,18 +397,18 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" dependencies = [ - "bytes", + "bytes", ] [[package]] name = "cc" -version = "1.2.17" +version = "1.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" dependencies = [ - "jobserver", - "libc", - "shlex", + "jobserver", + "libc", + "shlex", ] [[package]] @@ -419,17 +419,17 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link", + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", ] [[package]] @@ -444,9 +444,9 @@ version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ - "percent-encoding", - "time", - "version_check", + "percent-encoding", + "time", + "version_check", ] [[package]] @@ -455,8 +455,8 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "core-foundation-sys", - "libc", + "core-foundation-sys", + "libc", ] [[package]] @@ -471,7 +471,7 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "libc", + "libc", ] [[package]] @@ -480,7 +480,7 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ - "cfg-if", + "cfg-if", ] [[package]] @@ -489,8 +489,8 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] @@ -499,7 +499,7 @@ version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "crossbeam-utils", + "crossbeam-utils", ] [[package]] @@ -514,17 +514,51 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", - "typenum", + "generic-array", + "typenum", +] + +[[package]] +name = "datafeed-cache-client" +version = "0.0.1" +dependencies = [ + "datafeed-cache-shared", + "dotenv", + "reqwest", + "serde", +] + +[[package]] +name = "datafeed-cache-server" +version = "1.2.1" +dependencies = [ + "actix-web", + "chrono", + "datafeed-cache-shared", + "env_logger", + "geo", + "log", + "rand", + "reqwest", + "serde", + "tokio", +] + +[[package]] +name = "datafeed-cache-shared" +version = "0.0.1" +dependencies = [ + "chrono", + "serde", ] [[package]] name = "deranged" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ - "powerfmt", + "powerfmt", ] [[package]] @@ -533,7 +567,7 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl", + "derive_more-impl", ] [[package]] @@ -542,25 +576,10 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", -] - -[[package]] -name = "df-cache" -version = "1.2.1" -dependencies = [ - "actix-web", - "chrono", - "env_logger", - "geo", - "log", - "rand", - "reqwest", - "serde", - "tokio", + "proc-macro2", + "quote", + "syn", + "unicode-xid", ] [[package]] @@ -569,8 +588,8 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", + "block-buffer", + "crypto-common", ] [[package]] @@ -579,19 +598,25 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + [[package]] name = "earcutr" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79127ed59a85d7687c409e9978547cffb7dc79675355ed22da6b66fd5f6ead01" dependencies = [ - "itertools", - "num-traits", + "itertools", + "num-traits", ] [[package]] @@ -606,7 +631,7 @@ version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "cfg-if", + "cfg-if", ] [[package]] @@ -615,21 +640,21 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ - "log", - "regex", + "log", + "regex", ] [[package]] name = "env_logger" -version = "0.11.7" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3716d7a920fb4fac5d84e9d4bce8ceb321e9414b4409da61b07b75c1e3d0697" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ - "anstream", - "anstyle", - "env_filter", - "jiff", - "log", + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", ] [[package]] @@ -640,12 +665,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ - "libc", - "windows-sys 0.59.0", + "libc", + "windows-sys 0.59.0", ] [[package]] @@ -656,12 +681,12 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ - "crc32fast", - "miniz_oxide", + "crc32fast", + "miniz_oxide", ] [[package]] @@ -688,7 +713,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared", ] [[package]] @@ -703,7 +728,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "percent-encoding", + "percent-encoding", ] [[package]] @@ -712,7 +737,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ - "futures-core", + "futures-core", ] [[package]] @@ -739,10 +764,10 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "pin-utils", + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", ] [[package]] @@ -751,8 +776,8 @@ version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "typenum", - "version_check", + "typenum", + "version_check", ] [[package]] @@ -761,16 +786,16 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4416397671d8997e9a3e7ad99714f4f00a22e9eaa9b966a5985d2194fc9e02e1" dependencies = [ - "earcutr", - "float_next_after", - "geo-types", - "geographiclib-rs", - "i_overlay", - "log", - "num-traits", - "robust", - "rstar", - "spade", + "earcutr", + "float_next_after", + "geo-types", + "geographiclib-rs", + "i_overlay", + "log", + "num-traits", + "robust", + "rstar", + "spade", ] [[package]] @@ -779,43 +804,43 @@ version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62ddb1950450d67efee2bbc5e429c68d052a822de3aad010d28b351fbb705224" dependencies = [ - "approx", - "num-traits", - "rayon", - "rstar", - "serde", + "approx", + "num-traits", + "rayon", + "rstar", + "serde", ] [[package]] name = "geographiclib-rs" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e5ed84f8089c70234b0a8e0aedb6dc733671612ddc0d37c6066052f9781960" +checksum = "f611040a2bb37eaa29a78a128d1e92a378a03e0b6e66ae27398d42b1ba9a7841" dependencies = [ - "libm", + "libm", ] [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -830,36 +855,36 @@ version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] name = "h2" -version = "0.4.8" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.3.1", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] @@ -868,18 +893,18 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" dependencies = [ - "byteorder", + "byteorder", ] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", + "allocator-api2", + "equivalent", + "foldhash", ] [[package]] @@ -888,8 +913,8 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" dependencies = [ - "hash32", - "stable_deref_trait", + "hash32", + "stable_deref_trait", ] [[package]] @@ -898,9 +923,9 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ - "bytes", - "fnv", - "itoa", + "bytes", + "fnv", + "itoa", ] [[package]] @@ -909,9 +934,9 @@ version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ - "bytes", - "fnv", - "itoa", + "bytes", + "fnv", + "itoa", ] [[package]] @@ -920,8 +945,8 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "bytes", - "http 1.3.1", + "bytes", + "http 1.3.1", ] [[package]] @@ -930,11 +955,11 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ - "bytes", - "futures-core", - "http 1.3.1", - "http-body", - "pin-project-lite", + "bytes", + "futures-core", + "http 1.3.1", + "http-body", + "pin-project-lite", ] [[package]] @@ -955,18 +980,18 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.8", - "http 1.3.1", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.10", + "http 1.3.1", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", ] [[package]] @@ -975,15 +1000,15 @@ version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ - "futures-util", - "http 1.3.1", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", + "futures-util", + "http 1.3.1", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", ] [[package]] @@ -992,33 +1017,34 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.3.1", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", + "bytes", + "futures-channel", + "futures-util", + "http 1.3.1", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] @@ -1027,7 +1053,7 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85df3a416829bb955fdc2416c7b73680c8dcea8d731f2c7aa23e1042fe1b8343" dependencies = [ - "serde", + "serde", ] [[package]] @@ -1042,11 +1068,11 @@ version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0542dfef184afdd42174a03dcc0625b6147fb73e1b974b1a08a2a42ac35cee49" dependencies = [ - "i_float", - "i_key_sort", - "i_shape", - "i_tree", - "rayon", + "i_float", + "i_key_sort", + "i_shape", + "i_tree", + "rayon", ] [[package]] @@ -1055,8 +1081,8 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a38f5a42678726718ff924f6d4a0e79b129776aeed298f71de4ceedbd091bce" dependencies = [ - "i_float", - "serde", + "i_float", + "serde", ] [[package]] @@ -1067,17 +1093,17 @@ checksum = "155181bc97d770181cf9477da51218a19ee92a8e5be642e796661aee2b601139" [[package]] name = "iana-time-zone" -version = "0.1.62" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2fd658b06e56721792c5df4475705b6cda790e9298d19d2f8af083457bcd127" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", ] [[package]] @@ -1086,125 +1112,93 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cc", + "cc", ] [[package]] name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "icu_locid_transform" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" [[package]] name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ - "proc-macro2", - "quote", - "syn", + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", ] [[package]] @@ -1213,19 +1207,19 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "icu_normalizer", - "icu_properties", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -1236,12 +1230,12 @@ checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" [[package]] name = "indexmap" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ - "equivalent", - "hashbrown", + "equivalent", + "hashbrown", ] [[package]] @@ -1262,7 +1256,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ - "either", + "either", ] [[package]] @@ -1273,35 +1267,36 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.5" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c102670231191d07d37a35af3eb77f1f0dbf7a71be51a962dcd57ea607be7260" +checksum = "f02000660d30638906021176af16b17498bd0d12813dbfe7b276d8bc7f3c0806" dependencies = [ - "jiff-static", - "log", - "portable-atomic", - "portable-atomic-util", - "serde", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", ] [[package]] name = "jiff-static" -version = "0.2.5" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cdde31a9d349f1b1f51a0b3714a5940ac022976f4b49485fc04be052b183b4c" +checksum = "f3c30758ddd7188629c6713fc45d1188af4f44c90582311d0c8d8c9907f60c48" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "libc", + "getrandom 0.3.3", + "libc", ] [[package]] @@ -1310,8 +1305,8 @@ version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ - "once_cell", - "wasm-bindgen", + "once_cell", + "wasm-bindgen", ] [[package]] @@ -1322,27 +1317,27 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "local-channel" @@ -1350,9 +1345,9 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" dependencies = [ - "futures-core", - "futures-sink", - "local-waker", + "futures-core", + "futures-sink", + "local-waker", ] [[package]] @@ -1367,8 +1362,8 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "autocfg", - "scopeguard", + "autocfg", + "scopeguard", ] [[package]] @@ -1391,11 +1386,11 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ - "adler2", + "adler2", ] [[package]] @@ -1404,10 +1399,10 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", ] [[package]] @@ -1416,15 +1411,15 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", ] [[package]] @@ -1439,8 +1434,8 @@ version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "autocfg", - "libm", + "autocfg", + "libm", ] [[package]] @@ -1449,7 +1444,7 @@ version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ - "memchr", + "memchr", ] [[package]] @@ -1460,17 +1455,17 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl" -version = "0.10.71" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", ] [[package]] @@ -1479,9 +1474,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -1492,14 +1487,14 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.106" +version = "0.9.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] @@ -1508,8 +1503,8 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ - "lock_api", - "parking_lot_core", + "lock_api", + "parking_lot_core", ] [[package]] @@ -1518,11 +1513,11 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", ] [[package]] @@ -1561,7 +1556,16 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" dependencies = [ - "portable-atomic", + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", ] [[package]] @@ -1576,16 +1580,16 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy", + "zerocopy", ] [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ - "unicode-ident", + "unicode-ident", ] [[package]] @@ -1594,7 +1598,7 @@ version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ - "proc-macro2", + "proc-macro2", ] [[package]] @@ -1605,13 +1609,12 @@ checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ - "rand_chacha", - "rand_core", - "zerocopy", + "rand_chacha", + "rand_core", ] [[package]] @@ -1620,8 +1623,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ - "ppv-lite86", - "rand_core", + "ppv-lite86", + "rand_core", ] [[package]] @@ -1630,7 +1633,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] @@ -1639,8 +1642,8 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ - "either", - "rayon-core", + "either", + "rayon-core", ] [[package]] @@ -1649,17 +1652,17 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "crossbeam-deque", + "crossbeam-utils", ] [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags", + "bitflags", ] [[package]] @@ -1668,10 +1671,10 @@ version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] @@ -1680,9 +1683,9 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] @@ -1703,42 +1706,42 @@ version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.4.8", - "http 1.3.1", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.10", + "http 1.3.1", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", ] [[package]] @@ -1747,19 +1750,19 @@ version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.15", - "libc", - "untrusted", - "windows-sys 0.52.0", + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", ] [[package]] name = "robust" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf4a6aa5f6d6888f39e980649f3ad6b666acdce1d78e95b8a2cb076e687ae30" +checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839" [[package]] name = "rstar" @@ -1767,9 +1770,9 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb" dependencies = [ - "heapless", - "num-traits", - "smallvec", + "heapless", + "num-traits", + "smallvec", ] [[package]] @@ -1780,28 +1783,28 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "1.0.3" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.25" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] @@ -1810,24 +1813,27 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "rustls-pki-types", + "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] @@ -1848,7 +1854,7 @@ version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.59.0", ] [[package]] @@ -1863,11 +1869,11 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", ] [[package]] @@ -1876,8 +1882,8 @@ version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ - "core-foundation-sys", - "libc", + "core-foundation-sys", + "libc", ] [[package]] @@ -1886,7 +1892,7 @@ version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ - "serde_derive", + "serde_derive", ] [[package]] @@ -1895,9 +1901,9 @@ version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -1906,10 +1912,10 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", + "itoa", + "memchr", + "ryu", + "serde", ] [[package]] @@ -1918,10 +1924,10 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", + "form_urlencoded", + "itoa", + "ryu", + "serde", ] [[package]] @@ -1930,9 +1936,9 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "cfg-if", - "cpufeatures", - "digest", + "cfg-if", + "cpufeatures", + "digest", ] [[package]] @@ -1943,11 +1949,11 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ - "libc", + "libc", ] [[package]] @@ -1956,23 +1962,23 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ - "autocfg", + "autocfg", ] [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ - "libc", - "windows-sys 0.52.0", + "libc", + "windows-sys 0.52.0", ] [[package]] @@ -1981,10 +1987,10 @@ version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ece03ff43cd2a9b57ebf776ea5e78bd30b3b4185a619f041079f4109f385034" dependencies = [ - "hashbrown", - "num-traits", - "robust", - "smallvec", + "hashbrown", + "num-traits", + "robust", + "smallvec", ] [[package]] @@ -2001,13 +2007,13 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] @@ -2016,18 +2022,18 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ - "futures-core", + "futures-core", ] [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2036,9 +2042,9 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", - "core-foundation", - "system-configuration-sys", + "bitflags", + "core-foundation", + "system-configuration-sys", ] [[package]] @@ -2047,21 +2053,21 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ - "core-foundation-sys", - "libc", + "core-foundation-sys", + "libc", ] [[package]] name = "tempfile" -version = "3.19.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "fastrand", - "getrandom 0.3.2", - "once_cell", - "rustix", - "windows-sys 0.59.0", + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.59.0", ] [[package]] @@ -2070,13 +2076,13 @@ version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", ] [[package]] @@ -2091,36 +2097,36 @@ version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ - "num-conv", - "time-core", + "num-conv", + "time-core", ] [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ - "displaydoc", - "zerovec", + "displaydoc", + "zerovec", ] [[package]] name = "tokio" -version = "1.44.1" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", ] [[package]] @@ -2129,9 +2135,9 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2140,8 +2146,8 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ - "native-tls", - "tokio", + "native-tls", + "tokio", ] [[package]] @@ -2150,21 +2156,21 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls", - "tokio", + "rustls", + "tokio", ] [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] [[package]] @@ -2173,13 +2179,13 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", ] [[package]] @@ -2200,10 +2206,10 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", ] [[package]] @@ -2212,9 +2218,9 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2223,7 +2229,7 @@ version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ - "once_cell", + "once_cell", ] [[package]] @@ -2262,17 +2268,11 @@ version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", + "form_urlencoded", + "idna", + "percent-encoding", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2303,7 +2303,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "try-lock", + "try-lock", ] [[package]] @@ -2318,7 +2318,7 @@ version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen-rt", ] [[package]] @@ -2327,10 +2327,10 @@ version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", ] [[package]] @@ -2339,12 +2339,12 @@ version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", ] [[package]] @@ -2353,11 +2353,11 @@ version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -2366,8 +2366,8 @@ version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ - "quote", - "wasm-bindgen-macro-support", + "quote", + "wasm-bindgen-macro-support", ] [[package]] @@ -2376,11 +2376,11 @@ version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", ] [[package]] @@ -2389,7 +2389,7 @@ version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" dependencies = [ - "unicode-ident", + "unicode-ident", ] [[package]] @@ -2398,17 +2398,43 @@ version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ - "js-sys", - "wasm-bindgen", + "js-sys", + "wasm-bindgen", ] [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "46ec44dc15085cea82cf9c78f85a9114c463a369786585ad2882d1ff0b0acf40" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.1", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2423,18 +2449,18 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.53.0", + "windows-result", + "windows-strings 0.3.1", + "windows-targets 0.53.0", ] [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "4b895b5356fc36103d0f64dd1e94dfa7ac5633f1c9dd6e80fe9ec4adef69e09d" dependencies = [ - "windows-link", + "windows-link", ] [[package]] @@ -2443,7 +2469,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-link", + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a7ab927b2637c19b3dbe0965e75d8f2d30bdd697a1516191cad2ec4df8fb28a" +dependencies = [ + "windows-link", ] [[package]] @@ -2452,7 +2487,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.52.6", ] [[package]] @@ -2461,7 +2496,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.52.6", ] [[package]] @@ -2470,14 +2505,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -2486,14 +2521,14 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -2598,63 +2633,57 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags", + "bitflags", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", ] [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", + "proc-macro2", + "quote", + "syn", + "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2663,7 +2692,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ - "zerofrom-derive", + "zerofrom-derive", ] [[package]] @@ -2672,10 +2701,10 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", + "proc-macro2", + "quote", + "syn", + "synstructure", ] [[package]] @@ -2684,26 +2713,37 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", + "yoke", + "zerofrom", + "zerovec-derive", ] [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2712,7 +2752,7 @@ version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ - "zstd-safe", + "zstd-safe", ] [[package]] @@ -2721,7 +2761,7 @@ version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ - "zstd-sys", + "zstd-sys", ] [[package]] @@ -2730,6 +2770,6 @@ version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ - "cc", - "pkg-config", + "cc", + "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index 4c36737..0eba122 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,15 +1,6 @@ -[package] -name = "df-cache" -version = "1.2.1" -edition = "2024" - -[dependencies] -tokio = { version = "1.44.1", features = ["macros", "rt-multi-thread", "time"] } -actix-web = { version = "4.10.2" } -reqwest = { version = "0.12.15", features = ["json"] } -serde = { version = "1.0.219", features = ["derive"] } -chrono = { version = "0.4.40", features = ["serde"] } -rand = "0.9.0" -env_logger = "0.11.7" -log = "0.4.27" -geo = { version = "0.30.0" } +[workspace] +members = [ + "datafeed-cache-client", + "datafeed-cache-server", + "datafeed-cache-shared" +] \ No newline at end of file diff --git a/datafeed-cache-client/Cargo.toml b/datafeed-cache-client/Cargo.toml new file mode 100644 index 0000000..a23608e --- /dev/null +++ b/datafeed-cache-client/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "datafeed-cache-client" +version = "0.0.1" +edition = "2024" + +[dependencies] +reqwest = { version = "0.12.15", features = ["json"] } +serde = { version = "1.0.219", features = ["derive"] } +dotenv = { version = "0.15.0" } +datafeed-cache-shared = { path = "../datafeed-cache-shared" } + +[lib] +name = "datafeed_cache_client" +path = "src/lib.rs" \ No newline at end of file diff --git a/datafeed-cache-client/src/client.rs b/datafeed-cache-client/src/client.rs new file mode 100644 index 0000000..af04629 --- /dev/null +++ b/datafeed-cache-client/src/client.rs @@ -0,0 +1,89 @@ +use datafeed_cache_shared::datafeed::{ + DatafeedAtis, DatafeedController, DatafeedMilitaryRating, DatafeedPilot, DatafeedPilotRating, + DatafeedServer, +}; +use datafeed_cache_shared::response::{ + DatafeedGeneralResponse, DatafeedListResponse, DatafeedResponse, +}; +use reqwest::Client; +use serde::de::DeserializeOwned; + +pub struct DatafeedClient { + client: Client, + base_url: String, +} + +const BASE_DEFAULT: &'static str = "https://df.vatsim-germany.org"; + +type Error = reqwest::Error; + +#[allow(dead_code)] +impl DatafeedClient { + pub fn new() -> Self { + dotenv::dotenv().unwrap_or_default(); + + DatafeedClient { + client: Client::default(), + base_url: dotenv::var("DF_BASE_URL").unwrap_or(BASE_DEFAULT.to_string()), + } + } + + async fn make_request(&self, path: &str) -> Result + where + T: DeserializeOwned, + { + let req = self.client.get(self.base_url.to_owned() + path).build()?; + let response = self.client.execute(req).await?; + response.json::().await + } + + pub async fn get(&self) -> Result { + self.make_request("/datafeed").await + } + + pub async fn get_general(&self) -> Result { + self.make_request("/datafeed/general").await + } + + pub async fn get_controllers(&self) -> Result, Error> { + self.make_request("/datafeed/controllers").await + } + + pub async fn get_pilots(&self) -> Result, Error> { + self.make_request("/datafeed/pilots").await + } + + pub async fn get_atis(&self) -> Result, Error> { + self.make_request("/datafeed/atis").await + } + + pub async fn get_servers(&self) -> Result, Error> { + self.make_request("/datafeed/servers").await + } + + pub async fn get_pilot_ratings( + &self, + ) -> Result, Error> { + self.make_request("/datafeed/pilot_ratings").await + } + + pub async fn get_military_ratings( + &self, + ) -> Result, Error> { + self.make_request("/datafeed/military_ratings").await + } + + pub async fn get_ger_controllers( + &self, + ) -> Result, Error> { + self.make_request("/datafeed/controllers/ger").await + } + + pub async fn get_ger_pilots(&self) -> Result, Error> { + self.make_request("/datafeed/pilots/ger").await + } + + pub async fn get_ger_atis(&self) -> Result, Error> { + self.make_request("/datafeed/atis/ger").await + } +} diff --git a/datafeed-cache-client/src/lib.rs b/datafeed-cache-client/src/lib.rs new file mode 100644 index 0000000..841f477 --- /dev/null +++ b/datafeed-cache-client/src/lib.rs @@ -0,0 +1,8 @@ +pub mod client; + +pub mod shared { + pub use datafeed_cache_shared::*; +} + +// TODO: Add Tests here which force the functions to work, even if the datafeed-cache has been +// TODO: modified diff --git a/datafeed-cache-server/Cargo.toml b/datafeed-cache-server/Cargo.toml new file mode 100644 index 0000000..8e440a6 --- /dev/null +++ b/datafeed-cache-server/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "datafeed-cache-server" +version = "1.2.1" +edition = "2024" + +[dependencies] +tokio = { version = "1.44.1", features = ["macros", "rt-multi-thread", "time"] } +actix-web = { version = "4.10.2" } +reqwest = { version = "0.12.15", features = ["json"] } +serde = { version = "1.0.219", features = ["derive"] } +rand = "0.9.0" +env_logger = "0.11.7" +log = "0.4.27" +geo = { version = "0.30.0" } +chrono = { version = "0.4.40", features = ["serde"] } +datafeed-cache-shared = { path = "../datafeed-cache-shared" } + +[[bin]] +name = "datafeed_cache_server" +path = "src/main.rs" \ No newline at end of file diff --git a/Dockerfile b/datafeed-cache-server/Dockerfile similarity index 62% rename from Dockerfile rename to datafeed-cache-server/Dockerfile index 10c9536..a50cebf 100644 --- a/Dockerfile +++ b/datafeed-cache-server/Dockerfile @@ -3,13 +3,13 @@ FROM rust:1.85-bookworm AS builder WORKDIR /tmp/dfcache COPY . . -RUN cargo build --release +RUN cargo build -p datafeed-cache-server --release FROM debian:bookworm-20210816-slim RUN apt update && apt install -y openssl ca-certificates curl && rm -rf /var/lib/apt/lists/* -COPY --from=builder /tmp/dfcache/target/release/df-cache /usr/local/bin/df-cache +COPY --from=builder /tmp/dfcache/target/release/datafeed_cache_server /usr/local/bin/df-cache -ARG COM_SHA="0000000" +ARG COM_SHA="N/A" ENV COMMIT_SHA=${COM_SHA} ENV RUST_LOG=info diff --git a/docker-compose.yml b/datafeed-cache-server/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to datafeed-cache-server/docker-compose.yml diff --git a/datafeed-cache-server/src/api/handlers.rs b/datafeed-cache-server/src/api/handlers.rs new file mode 100644 index 0000000..758d373 --- /dev/null +++ b/datafeed-cache-server/src/api/handlers.rs @@ -0,0 +1,229 @@ +use crate::api::state::ApiStateData; +use actix_web::HttpResponse; +use chrono::Utc; +use datafeed_cache_shared::datafeed::{ + DatafeedAtis, DatafeedController, DatafeedMilitaryRating, DatafeedPilot, DatafeedPilotRating, + DatafeedServer, +}; +use datafeed_cache_shared::response::{ + DatafeedGeneralResponse, DatafeedGerListResponse, DatafeedListResponse, DatafeedResponse, +}; +use geo::{Contains, Coord}; +use serde::Serialize; +use std::borrow::Cow; + +#[actix_web::get("")] +async fn get_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + HttpResponse::Ok().json(DatafeedResponse { + data: Cow::Borrowed(&status.data), + failed: status.failed, + }) +} + +#[actix_web::get("/general")] +async fn get_general_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + let datafeed = status.data.as_ref(); + + HttpResponse::Ok().json(DatafeedGeneralResponse { + data: datafeed.map_or(None, |df| Some(Cow::Borrowed(&df.general))), + controller_length: datafeed.map_or(0, |df| df.controllers.len()), + pilots_length: datafeed.map_or(0, |df| df.pilots.len()), + atis_length: datafeed.map_or(0, |df| df.atis.len()), + failed: status.failed, + }) +} + +#[actix_web::get("/controllers")] +async fn get_controllers_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + let controllers: &[DatafeedController] = status + .data + .as_ref() + .map_or(&[], |df| df.controllers.as_slice()); + + HttpResponse::Ok().json(DatafeedListResponse { + data: Cow::Borrowed(controllers), + length: controllers.len(), + failed: status.failed, + }) +} + +#[actix_web::get("/pilots")] +async fn get_pilots_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + let pilots: &[DatafeedPilot] = status.data.as_ref().map_or(&[], |df| df.pilots.as_slice()); + + HttpResponse::Ok().json(DatafeedListResponse { + data: Cow::Borrowed(pilots), + length: pilots.len(), + failed: status.failed, + }) +} + +#[actix_web::get("/atis")] +async fn get_atis_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + let atis_slice: &[DatafeedAtis] = status.data.as_ref().map_or(&[], |df| df.atis.as_slice()); + + HttpResponse::Ok().json(DatafeedListResponse { + data: Cow::Borrowed(atis_slice), + length: atis_slice.len(), + failed: status.failed, + }) +} + +#[actix_web::get("/servers")] +async fn get_servers_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + let servers: &[DatafeedServer] = status.data.as_ref().map_or(&[], |df| df.servers.as_slice()); + + HttpResponse::Ok().json(DatafeedListResponse { + data: Cow::Borrowed(servers), + length: servers.len(), + failed: status.failed, + }) +} + +#[actix_web::get("/pilot_ratings")] +async fn get_pilot_ratings_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + let pilot_ratings: &[DatafeedPilotRating] = status + .data + .as_ref() + .map_or(&[], |df| df.pilot_ratings.as_slice()); + + HttpResponse::Ok().json(DatafeedListResponse { + data: Cow::Borrowed(pilot_ratings), + length: pilot_ratings.len(), + failed: status.failed, + }) +} + +#[actix_web::get("/military_ratings")] +async fn get_mil_pilot_ratings_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + let military_ratings: &[DatafeedMilitaryRating] = status + .data + .as_ref() + .map_or(&[], |df| df.military_ratings.as_slice()); + + HttpResponse::Ok().json(DatafeedListResponse { + data: Cow::Borrowed(military_ratings), + length: military_ratings.len(), + failed: status.failed, + }) +} + +/// +/// Below contains the handlers for the endpoints specific to VATSIM-Germany. +/// +/// /vatsim/ger/[...] +/// + +#[actix_web::get("/controllers/ger")] +async fn get_ger_controllers_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + let controllers = status.data.as_ref().map_or(Vec::new(), |df| { + df.controllers + .iter() + .filter(|controller| { + (controller.callsign.starts_with("ED") || controller.callsign.starts_with("ET")) + && controller.frequency != "199.998" + }) + .cloned() + .collect() + }); + + HttpResponse::Ok().json(DatafeedGerListResponse { + data: Cow::Borrowed(&controllers), + length: controllers.len(), + failed: status.failed, + }) +} + +#[actix_web::get("/pilots/ger")] +async fn get_ger_pilots_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + let pilots = status.data.as_ref().map_or(Vec::new(), |df| { + df.pilots + .iter() + .filter(|pilot| { + let coord: Coord = + Coord::from((pilot.latitude.into(), pilot.longitude.into())); + data.ger_poly.contains(&coord) + }) + .cloned() + .collect() + }); + + HttpResponse::Ok().json(DatafeedGerListResponse { + data: Cow::Borrowed(&pilots), + length: pilots.len(), + failed: status.failed, + }) +} + +#[actix_web::get("/atis/ger")] +async fn get_ger_atis_datafeed(data: ApiStateData) -> HttpResponse { + let read_lock = data.shared_state.read().await; + let status = &*read_lock; + + let atis = status.data.as_ref().map_or(Vec::new(), |df| { + df.atis + .iter() + .filter(|atis| { + (atis.callsign.starts_with("ED") || atis.callsign.starts_with("ET")) + && atis.frequency != "199.998" + }) + .cloned() + .collect() + }); + + HttpResponse::Ok().json(DatafeedGerListResponse { + data: Cow::Borrowed(&atis), + length: atis.len(), + failed: status.failed, + }) +} + +/// +/// Health-Check endpoint +/// +/// /health-check +/// + +#[actix_web::get("/health-check")] +async fn get_health_check() -> HttpResponse { + #[derive(Serialize)] + struct Response { + build_hash: String, + timestamp: i64, + } + + HttpResponse::Ok().json(Response { + build_hash: std::env::var("COMMIT_SHA").unwrap_or("N/A".into()), + timestamp: Utc::now().timestamp(), + }) +} diff --git a/datafeed-cache-server/src/api/mod.rs b/datafeed-cache-server/src/api/mod.rs new file mode 100644 index 0000000..15d5046 --- /dev/null +++ b/datafeed-cache-server/src/api/mod.rs @@ -0,0 +1,38 @@ +use crate::api::state::ApiState; +use crate::vatsim::DatafeedSharedState; +use actix_web::middleware::TrailingSlash::Trim; +use actix_web::{App, HttpServer, middleware, web}; + +mod handlers; +mod state; + +pub(crate) async fn init_api(shared_datafeed: DatafeedSharedState) -> std::io::Result<()> { + let api_state = web::Data::new(ApiState::new(shared_datafeed)); + + HttpServer::new(move || { + App::new() + .app_data(api_state.clone()) + .wrap(middleware::NormalizePath::new(Trim)) + .wrap(middleware::Logger::new( + "%a \"%r\" %s \"%{User-Agent}i\" %Ts", + )) + .service( + web::scope("/datafeed") + .service(handlers::get_datafeed) + .service(handlers::get_general_datafeed) + .service(handlers::get_controllers_datafeed) + .service(handlers::get_pilots_datafeed) + .service(handlers::get_atis_datafeed) + .service(handlers::get_servers_datafeed) + .service(handlers::get_pilot_ratings_datafeed) + .service(handlers::get_mil_pilot_ratings_datafeed) + .service(handlers::get_ger_controllers_datafeed) + .service(handlers::get_ger_pilots_datafeed) + .service(handlers::get_ger_atis_datafeed), + ) + .service(handlers::get_health_check) + }) + .bind("0.0.0.0:8000")? + .run() + .await +} diff --git a/datafeed-cache-server/src/api/state.rs b/datafeed-cache-server/src/api/state.rs new file mode 100644 index 0000000..ed95b04 --- /dev/null +++ b/datafeed-cache-server/src/api/state.rs @@ -0,0 +1,31 @@ +use crate::vatsim::DatafeedSharedState; +use geo::{LineString, Polygon}; + +const GERMANY_POLY: &[(f64, f64)] = &[ + (47.610078, 7.476857), + (48.97135, 8.189489), + (49.466566, 6.380295), + (51.028373, 5.932113), + (54.84348, 7.145719), + (54.642252, 14.133224), + (50.843505, 14.750028), + (50.249433, 12.140394), + (48.675772, 13.854829), + (47.475928, 12.926649), +]; + +pub(crate) type ApiStateData = actix_web::web::Data; + +pub(crate) struct ApiState { + pub(crate) shared_state: DatafeedSharedState, + pub(crate) ger_poly: Polygon, +} + +impl ApiState { + pub(crate) fn new(shared_state: DatafeedSharedState) -> Self { + Self { + shared_state, + ger_poly: Polygon::new(LineString::from(GERMANY_POLY.to_vec()), vec![]), + } + } +} diff --git a/datafeed-cache-server/src/main.rs b/datafeed-cache-server/src/main.rs new file mode 100644 index 0000000..a05722a --- /dev/null +++ b/datafeed-cache-server/src/main.rs @@ -0,0 +1,34 @@ +use crate::api::init_api; +use crate::vatsim::DatafeedSharedState; +use crate::vatsim::datafeed::DatafeedStatus; +use env_logger; +use log::info; +use vatsim::status::VatsimStatus; + +mod api; +mod vatsim; + +#[tokio::main] +async fn main() { + env_logger::init(); + + info!( + "Starting Version: {}", + std::env::var("COMMIT_SHA").unwrap_or("N/A".into()) + ); + + let shared_datafeed: DatafeedSharedState = DatafeedStatus::new().into(); + let datafeed_url = VatsimStatus::get_datafeed_url().await; + info!("Selected Datafeed-URL: {}", datafeed_url); + + tokio::task::spawn({ + let shared_datafeed = shared_datafeed.clone(); + async move { + vatsim::datafeed::update_datafeed_loop(datafeed_url, shared_datafeed).await; + } + }); + + init_api(shared_datafeed) + .await + .expect("Failed to initialize API"); +} diff --git a/datafeed-cache-server/src/vatsim/datafeed.rs b/datafeed-cache-server/src/vatsim/datafeed.rs new file mode 100644 index 0000000..769b0e5 --- /dev/null +++ b/datafeed-cache-server/src/vatsim/datafeed.rs @@ -0,0 +1,91 @@ +use crate::vatsim::DatafeedSharedState; +use chrono::{TimeDelta, Utc}; +use datafeed_cache_shared::datafeed::Datafeed; +use log::{error, info}; +use serde::{Deserialize, Serialize}; +use std::error::Error; +use std::ops::Sub; + +const UPDATE_DATAFEED_INTERVAL_SECS: u64 = 15; + +#[derive(Serialize, Deserialize, Debug)] +pub(crate) struct DatafeedStatus { + pub data: Option, + pub failed: bool, +} + +impl DatafeedStatus { + pub(crate) fn new() -> Self { + Self { + data: None, + failed: true, + } + } +} + +pub(crate) trait DatafeedExt { + async fn download_from_url(url: &str) -> Result; + fn is_failed(&self, same_timestamp_count: &mut u32, previous: &Option) -> bool; +} + +impl DatafeedExt for Datafeed { + async fn download_from_url(url: &str) -> Result { + reqwest::get(url).await?.json().await + } + + fn is_failed(&self, same_timestamp_count: &mut u32, previous: &Option) -> bool { + match previous { + Some(previous) => { + if self.general.update_timestamp == previous.general.update_timestamp { + *same_timestamp_count += 1; + info!("Same timestamp count: {}", same_timestamp_count); + } else { + *same_timestamp_count = 0; + } + + let now = Utc::now().sub(TimeDelta::minutes(2)); + if self.pilots.len() == 0 + || self.pilots.len().abs_diff(previous.pilots.len()) > 500 + || *same_timestamp_count > 5 + || (*same_timestamp_count > 0 && previous.general.update_timestamp < now) + { + return true; + } + + false + } + None => false, + } + } +} + +pub(crate) async fn update_datafeed_loop(datafeed_url: String, shared_state: DatafeedSharedState) { + let mut same_timestamp_count: u32 = 0; + let mut interval = tokio::time::interval(tokio::time::Duration::from_secs( + UPDATE_DATAFEED_INTERVAL_SECS, + )); + + loop { + interval.tick().await; + + match Datafeed::download_from_url(datafeed_url.as_str()).await { + Ok(datafeed) => { + let mut write_guard = shared_state.write().await; + if datafeed.is_failed(&mut same_timestamp_count, &write_guard.data) { + error!("Failed to update vatsim"); + write_guard.failed = true; + continue; + } + + info!("{:?}", datafeed.general); + write_guard.data = Some(datafeed); + write_guard.failed = false; + } + Err(err) => { + error!("Failed to download or parse response: {:?}", err.source()); + let mut write_guard = shared_state.write().await; + write_guard.failed = true; + } + } + } +} diff --git a/datafeed-cache-server/src/vatsim/mod.rs b/datafeed-cache-server/src/vatsim/mod.rs new file mode 100644 index 0000000..67c908a --- /dev/null +++ b/datafeed-cache-server/src/vatsim/mod.rs @@ -0,0 +1,14 @@ +use crate::vatsim::datafeed::DatafeedStatus; +use std::sync::Arc; +use tokio::sync::RwLock; + +pub(crate) mod datafeed; +pub(crate) mod status; + +pub(crate) type DatafeedSharedState = Arc>; + +impl From for DatafeedSharedState { + fn from(value: DatafeedStatus) -> Self { + Arc::new(RwLock::new(value)) + } +} diff --git a/datafeed-cache-server/src/vatsim/status.rs b/datafeed-cache-server/src/vatsim/status.rs new file mode 100644 index 0000000..9080e50 --- /dev/null +++ b/datafeed-cache-server/src/vatsim/status.rs @@ -0,0 +1,60 @@ +use log::warn; +use rand::Rng; +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +struct StatusData { + v3: Vec, +} + +#[derive(Debug, Deserialize)] +pub(crate) struct VatsimStatus { + data: StatusData, +} + +const VATSIM_STATUS_URL: &'static str = "https://status.vatsim.net/status.json"; +const VATSIM_DEFAULT_DATAFEED_URL: &'static str = "https://data.vatsim.net/v3/vatsim-data.json"; + +impl VatsimStatus { + /// Retrieves a vatsim url to use from VATSIM's status page. + /// + /// # Returns + /// The selected vatsim url, or the default url in case there was an issue fetching the + /// newest status.json file. + pub(crate) async fn get_datafeed_url() -> String { + let response = reqwest::get(VATSIM_STATUS_URL).await; + let status: VatsimStatus = match response { + Ok(res) => res.json::().await.unwrap_or_else(|err| { + warn!("Falling back to default VatsimStatus. Error: {err}"); + Self::default() + }), + Err(err) => { + warn!("Falling back to default VatsimStatus. Error: {err}"); + Self::default() + } + }; + + Self::select_random_url(&status.data.v3) + } + + /// Selects a random string from a vector of strings. This is to be done as per VATSIM's + /// documentation in order to balance the load on the vatsim if this should become an issue + /// in the future + /// + /// # Returns + /// An owned version (cloned) of the selected String within the vector. + fn select_random_url(urls: &Vec) -> String { + let idx = rand::rng().random_range(0..urls.len()); + urls[idx].clone() + } +} + +impl Default for VatsimStatus { + fn default() -> Self { + Self { + data: StatusData { + v3: vec![VATSIM_DEFAULT_DATAFEED_URL.into()], + }, + } + } +} diff --git a/datafeed-cache-shared/Cargo.toml b/datafeed-cache-shared/Cargo.toml new file mode 100644 index 0000000..59fb756 --- /dev/null +++ b/datafeed-cache-shared/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "datafeed-cache-shared" +version = "0.0.1" +edition = "2024" +description = "" + +[dependencies] +serde = { version = "1.0.219", features = ["derive"] } +chrono = { version = "0.4.40", features = ["serde"] } \ No newline at end of file diff --git a/datafeed-cache-shared/src/datafeed.rs b/datafeed-cache-shared/src/datafeed.rs new file mode 100644 index 0000000..c8cd2f4 --- /dev/null +++ b/datafeed-cache-shared/src/datafeed.rs @@ -0,0 +1,135 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DatafeedGeneral { + pub version: u32, + pub reload: u32, + pub update: String, + pub update_timestamp: DateTime, + pub connected_clients: u32, + pub unique_users: u32, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DatafeedFlightPlan { + pub flight_rules: String, + pub aircraft: String, + pub aircraft_faa: String, + pub aircraft_short: String, + pub departure: String, + pub arrival: String, + pub alternate: String, + pub cruise_tas: String, + pub altitude: String, + pub deptime: String, + pub enroute_time: String, + pub fuel_time: String, + pub remarks: String, + pub route: String, + pub revision_id: u32, + pub assigned_transponder: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DatafeedPilot { + pub cid: u32, + pub name: String, + pub callsign: String, + pub server: String, + pub pilot_rating: i32, + pub military_rating: i32, + pub latitude: f32, + pub longitude: f32, + pub altitude: i32, + pub groundspeed: i32, + pub transponder: String, + pub heading: u16, + pub qnh_i_hg: f32, + pub qnh_mb: i32, + pub flight_plan: Option, + pub logon_time: DateTime, + pub last_updated: DateTime, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DatafeedController { + pub cid: u32, + pub name: String, + pub callsign: String, + pub frequency: String, + pub facility: i32, + pub rating: i32, + pub server: String, + pub visual_range: u32, + pub text_atis: Option>, + pub last_updated: DateTime, + pub logon_time: DateTime, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DatafeedAtis { + pub cid: u32, + pub name: String, + pub callsign: String, + pub frequency: String, + pub facility: i32, + pub rating: i32, + pub server: String, + pub visual_range: u32, + pub atis_code: Option, + pub text_atis: Option>, + pub last_updated: DateTime, + pub logon_time: DateTime, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DatafeedServer { + pub ident: String, + pub hostname_or_ip: String, + pub location: String, + pub name: String, + pub clients_connection_allowed: i32, + pub client_connections_allowed: bool, + pub is_sweatbox: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DatafeedFacility { + pub id: i32, + pub short: String, + pub long: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DatafeedPilotRating { + pub id: i32, + pub short_name: String, + pub long_name: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DatafeedPrefile { + pub cid: u32, + pub name: String, + pub callsign: String, + pub flight_plan: DatafeedFlightPlan, + pub last_updated: DateTime, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct Datafeed { + pub general: DatafeedGeneral, + pub pilots: Vec, + pub controllers: Vec, + pub atis: Vec, + pub servers: Vec, + pub prefiles: Vec, + pub facilities: Vec, + pub ratings: Vec, + pub pilot_ratings: Vec, + pub military_ratings: Vec, +} + +pub type DatafeedRating = DatafeedFacility; +pub type DatafeedMilitaryRating = DatafeedPilotRating; diff --git a/datafeed-cache-shared/src/lib.rs b/datafeed-cache-shared/src/lib.rs new file mode 100644 index 0000000..62802e4 --- /dev/null +++ b/datafeed-cache-shared/src/lib.rs @@ -0,0 +1,2 @@ +pub mod datafeed; +pub mod response; diff --git a/datafeed-cache-shared/src/response.rs b/datafeed-cache-shared/src/response.rs new file mode 100644 index 0000000..0b73e92 --- /dev/null +++ b/datafeed-cache-shared/src/response.rs @@ -0,0 +1,38 @@ +use crate::datafeed::{Datafeed, DatafeedGeneral}; +use serde::{Deserialize, Serialize}; +use std::borrow::Cow; + +#[derive(Serialize, Deserialize, Debug)] +pub struct DatafeedGeneralResponse<'a> { + pub data: Option>, + pub controller_length: usize, + pub pilots_length: usize, + pub atis_length: usize, + pub failed: bool, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct DatafeedResponse<'a> { + pub data: Cow<'a, Option>, + pub failed: bool, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct DatafeedListResponse<'a, T> +where + T: Clone, +{ + pub data: Cow<'a, [T]>, + pub length: usize, + pub failed: bool, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct DatafeedGerListResponse<'a, T> +where + T: Clone, +{ + pub data: Cow<'a, Vec>, + pub length: usize, + pub failed: bool, +}