diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8373dd4..7a70bcc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,49 +1,49 @@ stages: [build, release] image: 'themackabu/rust:zigbuild-1.75.0' before_script: - mkdir binary - apt-get update -yqq - - apt-get install -yqq zip clang llvm pkg-config libssl-dev + - apt-get install -yqq zip clang llvm pkg-config libssl-dev libssl-dev:arm64 - export CC="/usr/bin/clang" - export CXX="/usr/bin/clang++" build_linux_amd64: stage: build tags: [fedora] only: [/\d+\.\d+\.\d+.*$/] script: - cargo zigbuild -r --color always - zip binary/pmc_${CI_COMMIT_TAG}_linux_amd64.zip target/release/pmc -j artifacts: paths: [binary/] build_linux_aarch64: stage: build tags: [fedora] only: [/\d+\.\d+\.\d+.*$/] script: - cargo zigbuild -r --target aarch64-unknown-linux-gnu --color always - zip binary/pmc_${CI_COMMIT_TAG}_linux_aarch64.zip target/aarch64-unknown-linux-gnu/release/pmc -j artifacts: paths: [binary/] build_darwin_amd64: stage: build tags: [fedora] only: [/\d+\.\d+\.\d+.*$/] script: - cargo zigbuild -r --target x86_64-apple-darwin --color always - zip binary/pmc_${CI_COMMIT_TAG}_darwin_amd64.zip target/x86_64-apple-darwin/release/pmc -j artifacts: paths: [binary/] build_darwin_aarch64: stage: build tags: [fedora] only: [/\d+\.\d+\.\d+.*$/] script: - cargo zigbuild -r --target aarch64-apple-darwin --color always - zip binary/pmc_${CI_COMMIT_TAG}_darwin_arm.zip target/aarch64-apple-darwin/release/pmc -j artifacts: paths: [binary/] diff --git a/Cargo.lock b/Cargo.lock index 4c5b600..6eb1e1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3407 +1,3407 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "addr2line" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] [[package]] name = "android-tzdata" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" [[package]] name = "android_system_properties" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ "libc", ] [[package]] name = "ansi-str" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cf4578926a981ab0ca955dc023541d19de37112bc24c1a197bd806d3d86ad1d" dependencies = [ "ansitok", ] [[package]] name = "ansitok" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "220044e6a1bb31ddee4e3db724d29767f352de47445a6cd75e1a173142136c83" dependencies = [ "nom", "vte", ] [[package]] name = "anstream" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", "windows-sys 0.52.0", ] [[package]] name = "anyhow" version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca87830a3e3fb156dc96cfbd31cb620265dd053be734723f22b760d6cc3c3051" [[package]] name = "arrayref" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "arrayvec" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-stream" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" dependencies = [ "async-stream-impl", "futures-core", "pin-project-lite", ] [[package]] name = "async-stream-impl" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "async-trait" version = "0.1.76" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "531b97fb4cd3dfdce92c35dedbfdc1f0b9d8091c8ca943d6dae340ef5012d514" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "atomic" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" [[package]] name = "atomic" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" dependencies = [ "bytemuck", ] [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", ] [[package]] name = "base64" version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "binascii" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "blake3" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" dependencies = [ "arrayref", "arrayvec 0.7.4", "cc", "cfg-if", "constant_time_eq", ] [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "bstr" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" dependencies = [ "memchr", "serde", ] [[package]] name = "bumpalo" version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytecount" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" [[package]] name = "bytemuck" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "camino" version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" [[package]] name = "cc" version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "libc", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", "windows-targets 0.48.5", ] [[package]] name = "chrono-tz" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91d7b79e99bfaa0d47da0687c43aa3b7381938a62ad3a6498599039321f660b7" dependencies = [ "chrono", "chrono-tz-build", "phf", ] [[package]] name = "chrono-tz-build" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f" dependencies = [ "parse-zoneinfo", "phf", "phf_codegen", ] [[package]] name = "clap" version = "4.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap-verbosity-flag" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c90e95e5bd4e8ac34fa6f37c774b0c6f8ed06ea90c79931fd448fcf941a9767" +checksum = "b57f73ca21b17a0352944b9bb61803b6007bd911b6cccfef7153f7f0600ac495" dependencies = [ "clap", "log", ] [[package]] name = "clap_builder" version = "4.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_derive" version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "clap_lex" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "codespan-reporting" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ "termcolor", "unicode-width", ] [[package]] name = "colorchoice" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "colored" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ "lazy_static", "windows-sys 0.48.0", ] [[package]] name = "constant_time_eq" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] name = "cookie" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cd91cf61412820176e137621345ee43b3f4423e589e7ae4e50d601d93e35ef8" dependencies = [ "percent-encoding", "time", "version_check", ] [[package]] name = "core-foundation" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "core-foundation-sys" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] [[package]] name = "crc32fast" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" dependencies = [ "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" version = "0.9.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" dependencies = [ "cfg-if", ] [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", ] [[package]] name = "cxx" version = "1.0.112" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58ab30434ea0ff6aa640a08dda5284026a366d47565496fd40b6cbfbdd7e31a2" dependencies = [ "cc", "cxxbridge-flags", "cxxbridge-macro", "link-cplusplus", ] [[package]] name = "cxx-build" version = "1.0.112" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b649d7dfae8268450d53d109388b337b9352c7cba1fc10db4a1bc23c3dc189fb" dependencies = [ "cc", "codespan-reporting", "once_cell", "proc-macro2", "quote", "scratch", "syn 2.0.44", ] [[package]] name = "cxxbridge-flags" version = "1.0.112" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42281b20eba5218c539295c667c18e2f50211bb11902419194c6ed1ae808e547" [[package]] name = "cxxbridge-macro" version = "1.0.112" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b45506e3c66512b0a65d291a6b452128b7b1dd9841e20d1e151addbd2c00ea50" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "darwin-libproc" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fb90051930c9a0f09e585762152048e23ac74d20c10590ef7cf01c0343c3046" dependencies = [ "darwin-libproc-sys", "libc", "memchr", ] [[package]] name = "darwin-libproc-sys" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57cebb5bde66eecdd30ddc4b9cd208238b15db4982ccc72db59d699ea10867c1" dependencies = [ "libc", ] [[package]] name = "deranged" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", ] [[package]] name = "derive_more" version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] [[package]] name = "deunicode" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae2a35373c5c74340b79ae6780b498b2b183915ec5dacf263aac5a099bf485a" [[package]] name = "devise" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6eacefd3f541c66fc61433d65e54e0e46e0a029a819a7dbbc7a7b489e8a85f8" dependencies = [ "devise_codegen", "devise_core", ] [[package]] name = "devise_codegen" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8cf4b8dd484ede80fd5c547592c46c3745a617c8af278e2b72bea86b2dfed6" dependencies = [ "devise_core", "quote", ] [[package]] name = "devise_core" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a" dependencies = [ "bitflags 2.4.1", "proc-macro2", "proc-macro2-diagnostics", "quote", "syn 2.0.44", ] [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", ] [[package]] name = "dirs" version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ "dirs-sys", ] [[package]] name = "dirs-sys" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ "libc", "option-ext", "redox_users", "windows-sys 0.48.0", ] [[package]] name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encoding_rs" version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if", ] [[package]] name = "env_logger" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" dependencies = [ "humantime", "is-terminal", "log", "regex", "termcolor", ] [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", "windows-sys 0.52.0", ] [[package]] name = "fastrand" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "figment" version = "0.10.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7629b8c7bcd214a072c2c88b263b5bb3ceb54c34365d8c41c1665461aeae0993" dependencies = [ "atomic 0.6.0", "pear", "serde", "toml", "uncased", "version_check", ] [[package]] name = "filetime" version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", "redox_syscall 0.4.1", "windows-sys 0.52.0", ] [[package]] name = "flate2" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ "foreign-types-shared", ] [[package]] name = "foreign-types-shared" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-sink", "futures-task", "futures-util", ] [[package]] name = "futures-channel" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", ] [[package]] name = "futures-core" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-io" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-sink" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-sink", "futures-task", "memchr", "pin-project-lite", "pin-utils", "slab", ] [[package]] name = "generator" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" dependencies = [ "cc", "libc", "log", "rustversion", "windows", ] [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] [[package]] name = "getrandom" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "libc", "wasi", ] [[package]] name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "glob" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "global_placeholders" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d70af3f3fd800923fa445d6fa562e054d8abaf06df926f77dd6dbead1fefb275" dependencies = [ "parking_lot", ] [[package]] name = "globset" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" dependencies = [ "aho-corasick", "bstr", "log", "regex-automata 0.4.3", "regex-syntax 0.8.2", ] [[package]] name = "globwalk" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" dependencies = [ "bitflags 1.3.2", "ignore", "walkdir", ] [[package]] name = "h2" version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", "http", "indexmap", "slab", "tokio", "tokio-util", "tracing", ] [[package]] name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "home" version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "http" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", "itoa", ] [[package]] name = "http-body" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", "pin-project-lite", ] [[package]] name = "httparse" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humansize" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" dependencies = [ "libm", ] [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", "h2", "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", "socket2", "tokio", "tower-service", "tracing", "want", ] [[package]] name = "hyper-tls" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", "hyper", "native-tls", "tokio", "tokio-native-tls", ] [[package]] name = "iana-time-zone" version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", "windows-core", ] [[package]] name = "iana-time-zone-haiku" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ "cc", ] [[package]] name = "idna" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", ] [[package]] name = "ignore" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060" dependencies = [ "crossbeam-deque", "globset", "log", "memchr", "regex-automata 0.4.3", "same-file", "walkdir", "winapi-util", ] [[package]] name = "include_dir" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" dependencies = [ "include_dir_macros", ] [[package]] name = "include_dir_macros" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" dependencies = [ "proc-macro2", "quote", ] [[package]] name = "indexmap" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown", "serde", ] [[package]] name = "inlinable_string" version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" [[package]] name = "ipnet" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ "hermit-abi", "rustix", "windows-sys 0.52.0", ] [[package]] name = "itoa" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" [[package]] name = "libm" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libredox" version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ "bitflags 2.4.1", "libc", "redox_syscall 0.4.1", ] [[package]] name = "link-cplusplus" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" dependencies = [ "cc", ] [[package]] name = "linux-raw-sys" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", ] [[package]] name = "log" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "loom" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ "cfg-if", "generator", "scoped-tls", "serde", "serde_json", "tracing", "tracing-subscriber", ] [[package]] name = "mach" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" dependencies = [ "libc", ] [[package]] name = "macros-rs" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2c6d3c8d7adb9850f41a7797b7a9718784aefeee3d1fe5a84c09243703a49d0" [[package]] name = "matchers" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ "regex-automata 0.1.10", ] [[package]] name = "memchr" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memoffset" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ "autocfg", ] [[package]] name = "merkle_hash" version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2019c22dd07fa00549b671a150d126929eb1af56a4f4808a2e62aca8676995d" dependencies = [ "anyhow", "blake3", "camino", "rayon", ] [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" dependencies = [ "mime", "unicase", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] [[package]] name = "mio" version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "wasi", "windows-sys 0.48.0", ] [[package]] name = "multer" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" dependencies = [ "bytes", "encoding_rs", "futures-util", "http", "httparse", "log", "memchr", "mime", "spin", "tokio", "tokio-util", "version_check", ] [[package]] name = "native-tls" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" dependencies = [ "lazy_static", "libc", "log", "openssl", "openssl-probe", "openssl-sys", "schannel", "security-framework", "security-framework-sys", "tempfile", ] [[package]] name = "nix" version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" dependencies = [ "bitflags 1.3.2", "cc", "cfg-if", "libc", "memoffset", ] [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "nu-ansi-term" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ "overload", "winapi", ] [[package]] name = "num-traits" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", ] [[package]] name = "object" version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" version = "0.10.62" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" dependencies = [ "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", "once_cell", "openssl-macros", "openssl-sys", ] [[package]] name = "openssl-macros" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" version = "0.9.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" dependencies = [ "cc", "libc", "pkg-config", "vcpkg", ] [[package]] name = "option-ext" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "overload" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "papergrid" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ad43c07024ef767f9160710b3a6773976194758c7919b17e63b863db0bdf7fb" dependencies = [ "ansi-str", "ansitok", "bytecount", "fnv", "unicode-width", ] [[package]] name = "parking_lot" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", "redox_syscall 0.4.1", "smallvec", "windows-targets 0.48.5", ] [[package]] name = "parse-zoneinfo" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" dependencies = [ "regex", ] [[package]] name = "paste" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pear" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ccca0f6c17acc81df8e242ed473ec144cbf5c98037e69aa6d144780aad103c8" dependencies = [ "inlinable_string", "pear_codegen", "yansi", ] [[package]] name = "pear_codegen" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e22670e8eb757cff11d6c199ca7b987f352f0346e0be4dd23869ec72cb53c77" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", "syn 2.0.44", ] [[package]] name = "percent-encoding" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" dependencies = [ "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" dependencies = [ "pest", "pest_generator", ] [[package]] name = "pest_generator" version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "pest_meta" version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" dependencies = [ "once_cell", "pest", "sha2", ] [[package]] name = "phf" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ "phf_shared", ] [[package]] name = "phf_codegen" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" dependencies = [ "phf_generator", "phf_shared", ] [[package]] name = "phf_generator" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ "phf_shared", "rand", ] [[package]] name = "phf_shared" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" dependencies = [ "siphasher", ] [[package]] name = "pin-project-lite" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" [[package]] name = "platforms" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" dependencies = [ "serde", ] [[package]] name = "pmc" version = "1.7.1" dependencies = [ "anyhow", "bytes", "chrono", "clap", "clap-verbosity-flag", "colored", "cxx", "cxx-build", "env_logger", "flate2", "global_placeholders", "home", "include_dir", "lazy_static", "libc", "log", "macros-rs", "merkle_hash", "once_cell", "pretty_env_logger", "prometheus", "psutil", "regex", "reqwest", "rmp-serde", "rocket", "ryu", "serde", "serde_json", "simple-logging", "tabled", "tar", "tera", "termcolor", "tokio", "toml", "utoipa", "utoipa-rapidoc", "utoipa-swagger-ui", ] [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "pretty_env_logger" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" dependencies = [ "env_logger", "log", ] [[package]] name = "proc-macro-error" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", "syn 1.0.109", "version_check", ] [[package]] name = "proc-macro-error-attr" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ "proc-macro2", "quote", "version_check", ] [[package]] name = "proc-macro2" version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dd5e8a1f1029c43224ad5898e50140c2aebb1705f19e67c918ebf5b9e797fe1" dependencies = [ "unicode-ident", ] [[package]] name = "proc-macro2-diagnostics" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", "version_check", "yansi", ] [[package]] name = "prometheus" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" dependencies = [ "cfg-if", "fnv", "lazy_static", "memchr", "parking_lot", "protobuf", "thiserror", ] [[package]] name = "protobuf" version = "2.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" [[package]] name = "psutil" version = "3.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f866af2b0f8e4b0d2d00aad8a9c5fc48fad33466cd99a64cbb3a4c1505f1a62d" dependencies = [ "cfg-if", "darwin-libproc", "derive_more", "glob", "mach", "nix", "num_cpus", "once_cell", "platforms", "serde", "thiserror", "unescape", ] [[package]] name = "quote" version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22a37c9326af5ed140c86a46655b5278de879853be5573c01df185b6f49a580a" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[package]] name = "rayon" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" dependencies = [ "either", "rayon-core", ] [[package]] name = "rayon-core" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ "crossbeam-deque", "crossbeam-utils", ] [[package]] name = "redox_syscall" version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "redox_syscall" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_users" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ "getrandom", "libredox", "thiserror", ] [[package]] name = "ref-cast" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53313ec9f12686aeeffb43462c3ac77aa25f590a5f630eb2cde0de59417b29c7" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2566c4bf6845f2c2e83b27043c3f5dfcd5ba8f2937d6c00dc009bfb51a079dc4" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "regex" version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", "regex-automata 0.4.3", "regex-syntax 0.8.2", ] [[package]] name = "regex-automata" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ "regex-syntax 0.6.29", ] [[package]] name = "regex-automata" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", "regex-syntax 0.8.2", ] [[package]] name = "regex-syntax" version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" version = "0.11.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", "h2", "http", "http-body", "hyper", "hyper-tls", "ipnet", "js-sys", "log", "mime", "native-tls", "once_cell", "percent-encoding", "pin-project-lite", "serde", "serde_json", "serde_urlencoded", "system-configuration", "tokio", "tokio-native-tls", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", "winreg", ] [[package]] name = "rmp" version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" dependencies = [ "byteorder", "num-traits", "paste", ] [[package]] name = "rmp-serde" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" dependencies = [ "byteorder", "rmp", "serde", ] [[package]] name = "rocket" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e7bb57ccb26670d73b6a47396c83139447b9e7878cab627fdfe9ea8da489150" dependencies = [ "async-stream", "async-trait", "atomic 0.5.3", "binascii", "bytes", "either", "figment", "futures", "indexmap", "log", "memchr", "multer", "num_cpus", "parking_lot", "pin-project-lite", "rand", "ref-cast", "rocket_codegen", "rocket_http", "serde", "serde_json", "state", "tempfile", "time", "tokio", "tokio-stream", "tokio-util", "ubyte", "version_check", "yansi", ] [[package]] name = "rocket_codegen" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2238066abf75f21be6cd7dc1a09d5414a671f4246e384e49fe3f8a4936bd04c" dependencies = [ "devise", "glob", "indexmap", "proc-macro2", "quote", "rocket_http", "syn 2.0.44", "unicode-xid", "version_check", ] [[package]] name = "rocket_http" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37a1663694d059fe5f943ea5481363e48050acedd241d46deb2e27f71110389e" dependencies = [ "cookie", "either", "futures", "http", "hyper", "indexmap", "log", "memchr", "pear", "percent-encoding", "pin-project-lite", "ref-cast", "serde", "smallvec", "stable-pattern", "state", "time", "tokio", "uncased", ] [[package]] name = "rust-embed" version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a82c0bbc10308ed323529fd3c1dce8badda635aa319a5ff0e6466f33b8101e3f" dependencies = [ "rust-embed-impl", "rust-embed-utils", "walkdir", ] [[package]] name = "rust-embed-impl" version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6227c01b1783cdfee1bcf844eb44594cd16ec71c35305bf1c9fb5aade2735e16" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", "shellexpand", "syn 2.0.44", "walkdir", ] [[package]] name = "rust-embed-utils" version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cb0a25bfbb2d4b4402179c2cf030387d9990857ce08a32592c6238db9fa8665" dependencies = [ "sha2", "walkdir", ] [[package]] name = "rustc-demangle" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" version = "0.38.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" dependencies = [ "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", "windows-sys 0.52.0", ] [[package]] name = "rustversion" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "schannel" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "scoped-tls" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scratch" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" [[package]] name = "security-framework" version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", ] [[package]] name = "security-framework-sys" version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "serde" version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "serde_json" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "serde_spanned" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] [[package]] name = "serde_urlencoded" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", "itoa", "ryu", "serde", ] [[package]] name = "serde_yaml" version = "0.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a15e0ef66bf939a7c890a0bf6d5a733c70202225f9888a89ed5c62298b019129" dependencies = [ "indexmap", "itoa", "ryu", "serde", "unsafe-libyaml", ] [[package]] name = "sha2" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "sharded-slab" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] [[package]] name = "shellexpand" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" dependencies = [ "dirs", ] [[package]] name = "signal-hook-registry" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "simple-logging" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b00d48e85675326bb182a2286ea7c1a0b264333ae10f27a937a72be08628b542" dependencies = [ "lazy_static", "log", "thread-id", ] [[package]] name = "siphasher" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "slab" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "slug" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bd94acec9c8da640005f8e135a39fc0372e74535e6b368b7a04b875f784c8c4" dependencies = [ "deunicode", "wasm-bindgen", ] [[package]] name = "smallvec" version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "socket2" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys 0.48.0", ] [[package]] name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "stable-pattern" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" dependencies = [ "memchr", ] [[package]] name = "state" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" dependencies = [ "loom", ] [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syn" version = "2.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92d27c2c202598d05175a6dd3af46824b7f747f8d8e9b14c623f19fa5069735d" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "system-configuration" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "tabled" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c998b0c8b921495196a48aabaf1901ff28be0760136e31604f7967b0792050e" dependencies = [ "ansi-str", "ansitok", "papergrid", "tabled_derive", "unicode-width", ] [[package]] name = "tabled_derive" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c138f99377e5d653a371cdad263615634cfc8467685dfe8e73e2b8e98f44b17" dependencies = [ "heck", "proc-macro-error", "proc-macro2", "quote", "syn 1.0.109", ] [[package]] name = "tar" version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" dependencies = [ "filetime", "libc", "xattr", ] [[package]] name = "tempfile" version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.4.1", "rustix", "windows-sys 0.52.0", ] [[package]] name = "tera" version = "1.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "970dff17c11e884a4a09bc76e3a17ef71e01bb13447a11e85226e254fe6d10b8" dependencies = [ "chrono", "chrono-tz", "globwalk", "humansize", "lazy_static", "percent-encoding", "pest", "pest_derive", "rand", "regex", "serde", "serde_json", "slug", "unic-segment", ] [[package]] name = "termcolor" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cd5904763bad08ad5513ddbb12cf2ae273ca53fa9f68e843e236ec6dfccc09" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dcf4a824cce0aeacd6f38ae6f24234c8e80d68632338ebaa1443b5df9e29e19" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "thread-id" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7fbf4c9d56b320106cd64fd024dadfa0be7cb4706725fc44a7d7ce952d820c1" dependencies = [ "libc", "redox_syscall 0.1.57", "winapi", ] [[package]] name = "thread_local" version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ "cfg-if", "once_cell", ] [[package]] name = "time" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" dependencies = [ "deranged", "itoa", "powerfmt", "serde", "time-core", "time-macros", ] [[package]] name = "time-core" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" dependencies = [ "time-core", ] [[package]] name = "tinyvec" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ "backtrace", "bytes", "libc", "mio", "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "tokio-native-tls" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", "tokio", ] [[package]] name = "tokio-stream" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", "pin-project-lite", "tokio", ] [[package]] name = "tokio-util" version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", "tracing", ] [[package]] name = "toml" version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", "serde_spanned", "toml_datetime", "toml_edit", ] [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", "winnow", ] [[package]] name = "tower-service" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "tracing-core" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", ] [[package]] name = "tracing-log" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ "log", "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", "once_cell", "regex", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", ] [[package]] name = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ubyte" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" dependencies = [ "serde", ] [[package]] name = "ucd-trie" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "uncased" version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" dependencies = [ "serde", "version_check", ] [[package]] name = "unescape" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e" [[package]] name = "unic-char-property" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" dependencies = [ "unic-char-range", ] [[package]] name = "unic-char-range" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" [[package]] name = "unic-common" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" [[package]] name = "unic-segment" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" dependencies = [ "unic-ucd-segment", ] [[package]] name = "unic-ucd-segment" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" dependencies = [ "unic-char-property", "unic-char-range", "unic-ucd-version", ] [[package]] name = "unic-ucd-version" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" dependencies = [ "unic-common", ] [[package]] name = "unicase" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] [[package]] name = "unicode-bidi" version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-width" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "unsafe-libyaml" version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" [[package]] name = "url" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "utoipa" version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ff05e3bac2c9428f57ade702667753ca3f5cf085e2011fe697de5bfd49aa72d" dependencies = [ "indexmap", "serde", "serde_json", "serde_yaml", "utoipa-gen", ] [[package]] name = "utoipa-gen" version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f0b6f4667edd64be0e820d6631a60433a269710b6ee89ac39525b872b76d61d" dependencies = [ "proc-macro-error", "proc-macro2", "quote", "syn 2.0.44", ] [[package]] name = "utoipa-rapidoc" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d331839f6de584865f20c8138b73868d515ba62349ae4c8c1f78ffa54069e78" dependencies = [ "serde", "serde_json", "utoipa", ] [[package]] name = "utoipa-swagger-ui" version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f839caa8e09dddc3ff1c3112a91ef7da0601075ba5025d9f33ae99c4cb9b6e51" dependencies = [ "mime_guess", "regex", "rust-embed", "serde", "serde_json", "utoipa", "zip", ] [[package]] name = "valuable" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vte" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983" dependencies = [ "arrayvec 0.5.2", "utf8parse", "vte_generate_state_changes", ] [[package]] name = "vte_generate_state_changes" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" dependencies = [ "proc-macro2", "quote", ] [[package]] name = "walkdir" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", ] [[package]] name = "want" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ "try-lock", ] [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", "syn 2.0.44", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if", "js-sys", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", "syn 2.0.44", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "web-sys" version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ "windows-targets 0.48.5", ] [[package]] name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ "windows-targets 0.52.0", ] [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets 0.48.5", ] [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets 0.52.0", ] [[package]] name = "windows-targets" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm 0.48.5", "windows_aarch64_msvc 0.48.5", "windows_i686_gnu 0.48.5", "windows_i686_msvc 0.48.5", "windows_x86_64_gnu 0.48.5", "windows_x86_64_gnullvm 0.48.5", "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ "windows_aarch64_gnullvm 0.52.0", "windows_aarch64_msvc 0.52.0", "windows_i686_gnu 0.52.0", "windows_i686_msvc 0.52.0", "windows_x86_64_gnu 0.52.0", "windows_x86_64_gnullvm 0.52.0", "windows_x86_64_msvc 0.52.0", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" version = "0.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97a4882e6b134d6c28953a387571f1acdd3496830d5e36c5e3a1075580ea641c" dependencies = [ "memchr", ] [[package]] name = "winreg" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", "windows-sys 0.48.0", ] [[package]] name = "xattr" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "914566e6413e7fa959cc394fb30e563ba80f3541fbd40816d4c05a0fc3f2a0f1" dependencies = [ "libc", "linux-raw-sys", "rustix", ] [[package]] name = "yansi" version = "1.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1367295b8f788d371ce2dbc842c7b709c73ee1364d30351dd300ec2203b12377" dependencies = [ "is-terminal", ] [[package]] name = "zip" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ "byteorder", "crc32fast", "crossbeam-utils", "flate2", ] diff --git a/Cargo.toml b/Cargo.toml index e9b73f7..c08542a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,52 +1,52 @@ [package] name = "pmc" version = "1.7.1" edition = "2021" license = "MIT" repository = "https://lab.themackabu.dev/self/pmc" description = "PMC is a simple and easy to use PM2 alternative" [dependencies] log = "0.4.20" toml = "0.8.8" home = "0.5.9" ryu = "1.0.16" clap = "4.4.12" cxx = "1.0.112" bytes = "1.5.0" tera = "1.19.1" regex = "1.10.2" libc = "0.2.151" anyhow = "1.0.78" colored = "2.1.0" macros-rs = "0.5.0" termcolor = "1.4.0" rmp-serde = "1.1.2" once_cell = "1.19.0" env_logger = "0.10.1" merkle_hash = "3.5.0" lazy_static = "1.4.0" prometheus = "0.13.3" include_dir = "0.7.3" serde_json = "1.0.109" simple-logging = "2.0.2" utoipa-rapidoc = "2.0.0" pretty_env_logger = "0.5.0" utoipa-swagger-ui = "5.0.0" -clap-verbosity-flag = "2.1.1" +clap-verbosity-flag = "2.1.2" global_placeholders = "0.1.0" tokio = { version = "1.35.1", features = ["full"] } rocket = { version = "0.5.0", features = ["json"] } psutil = { version = "3.2.2", features = ["serde"] } tabled = { version = "0.15.0", features = ["ansi"] } chrono = { version = "0.4.31", features = ["serde"] } serde = { version = "1.0.193", features = ["derive"] } reqwest = { version = "0.11.23", features = ["blocking", "json"] } utoipa = { version = "4.1.0", features = ["serde_yaml", "non_strict_integers"] } [build-dependencies] tar = "0.4.40" chrono = "0.4.31" flate2 = "1.0.28" cxx-build = "1.0.112" reqwest = { version = "0.11.23", features = ["blocking"] } diff --git a/src/daemon/api/mod.rs b/src/daemon/api/mod.rs index 551800c..44c7a17 100644 --- a/src/daemon/api/mod.rs +++ b/src/daemon/api/mod.rs @@ -1,225 +1,233 @@ mod fairing; mod helpers; mod routes; mod structs; use crate::webui::{self, assets::NamedFile}; use helpers::create_status; use include_dir::{include_dir, Dir}; use lazy_static::lazy_static; use macros_rs::fmtstr; use pmc::{config, process}; use prometheus::{opts, register_counter, register_gauge, register_histogram, register_histogram_vec}; use prometheus::{Counter, Gauge, Histogram, HistogramVec}; use serde_json::{json, Value}; use std::sync::atomic::{AtomicBool, Ordering}; use structs::ErrorMessage; use utoipa_rapidoc::RapiDoc; use utoipa::{ openapi::security::{ApiKey, ApiKeyValue, SecurityScheme}, Modify, OpenApi, }; use rocket::{ catch, http::{ContentType, Status}, outcome::Outcome, request::{self, FromRequest, Request}, serde::json::Json, }; lazy_static! { pub static ref HTTP_COUNTER: Counter = register_counter!(opts!("http_requests_total", "Number of HTTP requests made.")).unwrap(); pub static ref DAEMON_START_TIME: Gauge = register_gauge!(opts!("process_start_time_seconds", "The uptime of the daemon.")).unwrap(); pub static ref DAEMON_MEM_USAGE: Histogram = register_histogram!("daemon_memory_usage", "The memory usage graph of the daemon.").unwrap(); pub static ref DAEMON_CPU_PERCENTAGE: Histogram = register_histogram!("daemon_cpu_percentage", "The cpu usage graph of the daemon.").unwrap(); pub static ref HTTP_REQ_HISTOGRAM: HistogramVec = register_histogram_vec!("http_request_duration_seconds", "The HTTP request latencies in seconds.", &["route"]).unwrap(); } #[derive(OpenApi)] #[openapi( modifiers(&SecurityAddon), servers( (url = "{ssl}://{address}:{port}/{path}", description = "Remote API", variables( ("ssl" = (default = "http", enum_values("http", "https"))), ("address" = (default = "localhost", description = "Address for API")), ("port" = (default = "5630", description = "Port for API")), ("path" = (default = "", description = "Path for API")) ) ) ), paths( routes::action_handler, routes::env_handler, routes::info_handler, routes::dump_handler, routes::servers_handler, routes::config_handler, routes::list_handler, routes::logs_handler, - routes::servers_list, + routes::remote_list, + routes::remote_info, + routes::remote_logs, + routes::remote_rename, + routes::remote_action, routes::logs_raw_handler, routes::metrics_handler, routes::prometheus_handler, routes::create_handler, routes::rename_handler ), components(schemas( ErrorMessage, process::Log, process::Raw, process::Info, process::Stats, process::Watch, process::ItemSingle, process::ProcessItem, routes::Stats, routes::Daemon, routes::Version, routes::ActionBody, routes::ConfigBody, routes::CreateBody, routes::MetricsRoot, routes::LogResponse, routes::DocMemoryInfo, routes::ActionResponse, )) )] struct ApiDoc; struct Logger; struct AddCORS; struct EnableWebUI; struct SecurityAddon; struct TeraState { path: String, tera: tera::Tera, } impl Modify for SecurityAddon { fn modify(&self, openapi: &mut utoipa::openapi::OpenApi) { let components = openapi.components.as_mut().unwrap(); components.add_security_scheme("api_key", SecurityScheme::ApiKey(ApiKey::Header(ApiKeyValue::new("token")))) } } #[catch(500)] fn internal_error<'m>() -> Json<ErrorMessage> { create_status(Status::InternalServerError) } #[catch(405)] fn not_allowed<'m>() -> Json<ErrorMessage> { create_status(Status::MethodNotAllowed) } #[catch(404)] fn not_found<'m>() -> Json<ErrorMessage> { create_status(Status::NotFound) } #[catch(401)] fn unauthorized<'m>() -> Json<ErrorMessage> { create_status(Status::Unauthorized) } #[rocket::async_trait] impl<'r> FromRequest<'r> for EnableWebUI { type Error = (); async fn from_request(_req: &'r Request<'_>) -> request::Outcome<Self, Self::Error> { let webui = IS_WEBUI.load(Ordering::Acquire); if webui { Outcome::Success(EnableWebUI) } else { Outcome::Error((rocket::http::Status::NotFound, ())) } } } #[rocket::async_trait] impl<'r> FromRequest<'r> for routes::Token { type Error = (); async fn from_request(request: &'r rocket::Request<'_>) -> rocket::request::Outcome<Self, Self::Error> { let config = config::read().daemon.web; if !config.secure.enabled { return Outcome::Success(routes::Token); } if let Some(header_value) = request.headers().get_one("token") { if header_value == config.secure.token { return Outcome::Success(routes::Token); } } Outcome::Error((rocket::http::Status::Unauthorized, ())) } } static IS_WEBUI: AtomicBool = AtomicBool::new(false); pub async fn start(webui: bool) { IS_WEBUI.store(webui, Ordering::Release); let tera = webui::create_templates(); let s_path = config::read().get_path().trim_end_matches('/').to_string(); let routes = rocket::routes![ docs, health, assets, docs_json, routes::login, routes::dashboard, routes::view_process, routes::action_handler, routes::env_handler, routes::info_handler, routes::dump_handler, - routes::servers_list, + routes::remote_list, + routes::remote_info, + routes::remote_logs, + routes::remote_rename, + routes::remote_action, routes::servers_handler, routes::config_handler, routes::list_handler, routes::logs_handler, routes::logs_raw_handler, routes::metrics_handler, routes::prometheus_handler, routes::create_handler, routes::rename_handler, ]; let rocket = rocket::custom(config::read().get_address()) .attach(Logger) .attach(AddCORS) .manage(TeraState { path: tera.1, tera: tera.0 }) .mount(format!("{s_path}/"), routes) .register("/", rocket::catchers![internal_error, not_allowed, not_found, unauthorized]) .launch() .await; if let Err(err) = rocket { log::error!("failed to launch!\n{err}") } } #[rocket::get("/assets/<name>")] pub async fn assets(name: String) -> Option<NamedFile> { static DIR: Dir = include_dir!("src/webui/dist/assets"); let file = DIR.get_file(&name)?; NamedFile::send(name, file.contents_utf8()).await.ok() } #[rocket::get("/docs")] pub async fn docs() -> (ContentType, String) { const DOCS: &str = include_str!("docs/index.html"); let s_path = config::read().get_path().trim_end_matches('/').to_string(); let docs_path = fmtstr!("{}/docs.json", s_path); (ContentType::HTML, RapiDoc::new(docs_path).custom_html(DOCS).to_html()) } #[rocket::get("/health")] pub async fn health() -> Value { json!({"healthy": true}) } #[rocket::get("/docs.json")] pub async fn docs_json() -> Value { json!(ApiDoc::openapi()) } diff --git a/src/daemon/api/routes.rs b/src/daemon/api/routes.rs index 1a3ecb2..6957a19 100644 --- a/src/daemon/api/routes.rs +++ b/src/daemon/api/routes.rs @@ -1,653 +1,834 @@ #![allow(non_snake_case)] use chrono::{DateTime, Utc}; use global_placeholders::global; use macros_rs::{fmtstr, string, ternary, then}; use prometheus::{Encoder, TextEncoder}; use psutil::process::{MemoryInfo, Process}; +use reqwest::header::HeaderValue; use serde::Deserialize; use tera::{Context, Tera}; use utoipa::ToSchema; use rocket::{ get, http::{ContentType, Status}, post, serde::{json::Json, Serialize}, State, }; use super::{ helpers::{generic_error, not_found, GenericError, NotFound}, structs::ErrorMessage, EnableWebUI, TeraState, }; use pmc::{ config, file, helpers, process::{dump, http::client, ItemSingle, ProcessItem, Runner}, }; use crate::daemon::{ api::{HTTP_COUNTER, HTTP_REQ_HISTOGRAM}, pid, }; use std::{ collections::HashMap, env, fs::{self, File}, io::{self, BufRead, BufReader}, path::PathBuf, }; pub(crate) struct Token; type EnvList = Json<HashMap<String, String>>; #[allow(dead_code)] #[derive(ToSchema)] #[schema(as = MemoryInfo)] pub(crate) struct DocMemoryInfo { rss: u64, vms: u64, #[cfg(target_os = "linux")] shared: u64, #[cfg(target_os = "linux")] text: u64, #[cfg(target_os = "linux")] data: u64, #[cfg(target_os = "macos")] page_faults: u64, #[cfg(target_os = "macos")] pageins: u64, } -#[derive(Deserialize, ToSchema)] +#[derive(Serialize, Deserialize, ToSchema)] pub(crate) struct ActionBody { #[schema(example = "restart")] method: String, } #[derive(Serialize, ToSchema)] pub(crate) struct ConfigBody { #[schema(example = "bash")] shell: String, #[schema(min_items = 1, example = json!(["-c"]))] args: Vec<String>, #[schema(example = "/home/user/.pmc/logs")] log_path: String, } -#[derive(Deserialize, ToSchema)] +#[derive(Serialize, Deserialize, ToSchema)] pub(crate) struct CreateBody { #[schema(example = "app")] name: Option<String>, #[schema(example = "node index.js")] script: String, #[schema(value_type = String, example = "/projects/app")] path: PathBuf, #[schema(example = "src")] watch: Option<String>, } -#[derive(Serialize, ToSchema)] +#[derive(Serialize, Deserialize, ToSchema)] pub(crate) struct ActionResponse { #[schema(example = true)] done: bool, #[schema(example = "name")] - action: &'static str, + action: String, } -#[derive(Serialize, ToSchema)] +#[derive(Serialize, Deserialize, ToSchema)] pub(crate) struct LogResponse { logs: Vec<String>, } #[derive(Serialize, ToSchema)] pub struct MetricsRoot { pub version: Version, pub daemon: Daemon, } #[derive(Serialize, ToSchema)] pub struct Version { #[schema(example = "v1.0.0")] pub pkg: String, pub hash: &'static str, #[schema(example = "2000-01-01")] pub build_date: &'static str, #[schema(example = "release")] pub target: &'static str, } #[derive(Serialize, ToSchema)] pub struct Daemon { pub pid: Option<i32>, #[schema(example = true)] pub running: bool, pub uptime: String, pub process_count: usize, #[schema(example = "default")] pub daemon_type: String, pub stats: Stats, } #[derive(Serialize, ToSchema)] pub struct Stats { pub memory_usage: String, pub cpu_percent: String, } fn attempt(done: bool, method: &str) -> ActionResponse { ActionResponse { done, - action: ternary!(done, Box::leak(Box::from(method)), "DOES_NOT_EXIST"), + action: ternary!(done, Box::leak(Box::from(method)), "DOES_NOT_EXIST").to_string(), } } fn render(name: &str, tmpl: &Tera, ctx: &Context) -> Result<String, NotFound> { tmpl.render(name, &ctx).or(Err(not_found("Page was not found"))) } #[get("/")] pub async fn dashboard(state: &State<TeraState>, _webui: EnableWebUI) -> Result<(ContentType, String), NotFound> { let mut ctx = Context::new(); ctx.insert("base_path", &state.path); let payload = render("dashboard", &state.tera, &ctx)?; Ok((ContentType::HTML, payload)) } #[get("/login")] pub async fn login(state: &State<TeraState>, _webui: EnableWebUI) -> Result<(ContentType, String), NotFound> { let mut ctx = Context::new(); ctx.insert("base_path", &state.path); let payload = render("login", &state.tera, &ctx)?; Ok((ContentType::HTML, payload)) } #[get("/view/<id>")] pub async fn view_process(id: usize, state: &State<TeraState>, _webui: EnableWebUI) -> Result<(ContentType, String), NotFound> { let mut ctx = Context::new(); ctx.insert("base_path", &state.path); ctx.insert("process_id", &id); let payload = render("view", &state.tera, &ctx)?; Ok((ContentType::HTML, payload)) } #[get("/daemon/prometheus")] #[utoipa::path(get, tag = "Daemon", path = "/daemon/prometheus", security((), ("api_key" = [])), responses( ( description = "Get prometheus metrics", body = String, status = 200, example = json!("# HELP daemon_cpu_percentage The cpu usage graph of the daemon.\n# TYPE daemon_cpu_percentage histogram\ndaemon_cpu_percentage_bucket{le=\"0.005\"} 0"), ), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn prometheus_handler(_t: Token) -> String { let encoder = TextEncoder::new(); let mut buffer = Vec::<u8>::new(); let metric_families = prometheus::gather(); encoder.encode(&metric_families, &mut buffer).unwrap(); String::from_utf8(buffer.clone()).unwrap() } #[get("/daemon/servers")] #[utoipa::path(get, tag = "Daemon", path = "/daemon/servers", security((), ("api_key" = [])), responses( (status = 200, description = "Get daemon servers successfully", body = [String]), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] -pub async fn servers_list(_t: Token) -> Result<Json<Vec<String>>, GenericError> { +pub async fn servers_handler(_t: Token) -> Result<Json<Vec<String>>, GenericError> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["servers"]).start_timer(); if let Some(servers) = config::servers().servers { HTTP_COUNTER.inc(); timer.observe_duration(); Ok(Json(servers.into_keys().collect())) } else { Err(generic_error(Status::BadRequest, string!("No servers have been added"))) } } -#[get("/daemon/server/<name>/list")] -#[utoipa::path(get, tag = "Daemon", path = "/daemon/server/{name}/list", security((), ("api_key" = [])), +#[get("/remote/<name>/list")] +#[utoipa::path(get, tag = "Remote", path = "/remote/{name}/list", security((), ("api_key" = [])), params(("name" = String, Path, description = "Name of remote daemon", example = "example"),), responses( (status = 200, description = "Get list from remote daemon successfully", body = [ProcessItem]), (status = NOT_FOUND, description = "Remote daemon does not exist", body = ErrorMessage), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] -pub async fn servers_handler(name: String, _t: Token) -> Result<Json<Vec<ProcessItem>>, GenericError> { - let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["servers"]).start_timer(); +pub async fn remote_list(name: String, _t: Token) -> Result<Json<Vec<ProcessItem>>, GenericError> { + let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["list"]).start_timer(); + + if let Some(servers) = config::servers().servers { + let (address, (client, headers)) = match servers.get(&name) { + Some(server) => (&server.address, client(&server.token).await), + None => return Err(generic_error(Status::NotFound, string!("Server was not found"))), + }; + + HTTP_COUNTER.inc(); + timer.observe_duration(); + + match client.get(fmtstr!("{address}/list")).headers(headers).send().await { + Ok(data) => { + if data.status() != 200 { + let err = data.json::<ErrorMessage>().await.unwrap(); + Err(generic_error(err.code, err.message)) + } else { + Ok(Json(data.json::<Vec<ProcessItem>>().await.unwrap())) + } + } + Err(err) => Err(generic_error(Status::InternalServerError, err.to_string())), + } + } else { + Err(generic_error(Status::BadRequest, string!("No servers have been added"))) + } +} + +#[get("/remote/<name>/info/<id>")] +#[utoipa::path(get, tag = "Remote", path = "/remote/{name}/info/{id}", security((), ("api_key" = [])), + params( + ("name" = String, Path, description = "Name of remote daemon", example = "example"), + ("id" = usize, Path, description = "Process id to get information for", example = 0) + ), + responses( + (status = 200, description = "Get process info from remote daemon successfully", body = [ProcessItem]), + (status = NOT_FOUND, description = "Remote daemon does not exist", body = ErrorMessage), + ( + status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, + example = json!({"code": 401, "message": "Unauthorized"}) + ) + ) +)] +pub async fn remote_info(name: String, id: usize, _t: Token) -> Result<Json<ItemSingle>, GenericError> { + let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["info"]).start_timer(); + + if let Some(servers) = config::servers().servers { + let (address, (client, headers)) = match servers.get(&name) { + Some(server) => (&server.address, client(&server.token).await), + None => return Err(generic_error(Status::NotFound, string!("Server was not found"))), + }; + + HTTP_COUNTER.inc(); + timer.observe_duration(); + + match client.get(fmtstr!("{address}/process/{id}/info")).headers(headers).send().await { + Ok(data) => { + if data.status() != 200 { + let err = data.json::<ErrorMessage>().await.unwrap(); + Err(generic_error(err.code, err.message)) + } else { + Ok(Json(data.json::<ItemSingle>().await.unwrap())) + } + } + Err(err) => Err(generic_error(Status::InternalServerError, err.to_string())), + } + } else { + Err(generic_error(Status::BadRequest, string!("No servers have been added"))) + } +} + +#[get("/remote/<name>/logs/<id>/<kind>")] +#[utoipa::path(get, tag = "Remote", path = "/remote/{name}/logs/{id}/{kind}", security((), ("api_key" = [])), + params( + ("name" = String, Path, description = "Name of remote daemon", example = "example"), + ("id" = usize, Path, description = "Process id to get information for", example = 0), + ("kind" = String, Path, description = "Log output type", example = "out") + ), + responses( + (status = 200, description = "Remote process logs of {type} fetched", body = LogResponse), + (status = NOT_FOUND, description = "Remote daemon does not exist", body = ErrorMessage), + ( + status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, + example = json!({"code": 401, "message": "Unauthorized"}) + ) + ) +)] +pub async fn remote_logs(name: String, id: usize, kind: String, _t: Token) -> Result<Json<LogResponse>, GenericError> { + let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["info"]).start_timer(); + + if let Some(servers) = config::servers().servers { + let (address, (client, headers)) = match servers.get(&name) { + Some(server) => (&server.address, client(&server.token).await), + None => return Err(generic_error(Status::NotFound, string!("Server was not found"))), + }; + + HTTP_COUNTER.inc(); + timer.observe_duration(); + + match client.get(fmtstr!("{address}/process/{id}/logs/{kind}")).headers(headers).send().await { + Ok(data) => { + if data.status() != 200 { + let err = data.json::<ErrorMessage>().await.unwrap(); + Err(generic_error(err.code, err.message)) + } else { + Ok(Json(data.json::<LogResponse>().await.unwrap())) + } + } + Err(err) => Err(generic_error(Status::InternalServerError, err.to_string())), + } + } else { + Err(generic_error(Status::BadRequest, string!("No servers have been added"))) + } +} + +#[post("/remote/<name>/rename/<id>", format = "text", data = "<body>")] +#[utoipa::path(post, tag = "Remote", path = "/remote/{name}/rename/{id}", + security((), ("api_key" = [])), + request_body(content = String, example = json!("example_name")), + params( + ("id" = usize, Path, description = "Process id to rename", example = 0), + ("name" = String, Path, description = "Name of remote daemon", example = "example"), + ), + responses( + ( + description = "Remote rename process successful", body = ActionResponse, + example = json!({"action": "rename", "done": true }), status = 200, + ), + (status = NOT_FOUND, description = "Process was not found", body = ErrorMessage), + ( + status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, + example = json!({"code": 401, "message": "Unauthorized"}) + ) + ) +)] +pub async fn remote_rename(name: String, id: usize, body: String, _t: Token) -> Result<Json<ActionResponse>, GenericError> { + let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["rename"]).start_timer(); + + if let Some(servers) = config::servers().servers { + let (address, (client, mut headers)) = match servers.get(&name) { + Some(server) => (&server.address, client(&server.token).await), + None => return Err(generic_error(Status::NotFound, string!("Server was not found"))), + }; + + HTTP_COUNTER.inc(); + timer.observe_duration(); + headers.insert("content-type", HeaderValue::from_static("text/plain")); + + match client.post(fmtstr!("{address}/process/{id}/rename")).body(body).headers(headers).send().await { + Ok(data) => { + if data.status() != 200 { + let err = data.json::<ErrorMessage>().await.unwrap(); + Err(generic_error(err.code, err.message)) + } else { + Ok(Json(data.json::<ActionResponse>().await.unwrap())) + } + } + Err(err) => Err(generic_error(Status::InternalServerError, err.to_string())), + } + } else { + Err(generic_error(Status::BadRequest, string!("No servers have been added"))) + } +} + +#[post("/remote/<name>/action/<id>", format = "json", data = "<body>")] +#[utoipa::path(post, tag = "Remote", path = "/remote/{name}/action/{id}", request_body = ActionBody, + security((), ("api_key" = [])), + params( + ("id" = usize, Path, description = "Process id to run action on", example = 0), + ("name" = String, Path, description = "Name of remote daemon", example = "example") + ), + responses( + (status = 200, description = "Run action on remote process successful", body = ActionResponse), + (status = NOT_FOUND, description = "Process/action was not found", body = ErrorMessage), + ( + status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, + example = json!({"code": 401, "message": "Unauthorized"}) + ) + ) +)] +pub async fn remote_action(name: String, id: usize, body: Json<ActionBody>, _t: Token) -> Result<Json<ActionResponse>, GenericError> { + let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["action"]).start_timer(); if let Some(servers) = config::servers().servers { let (address, (client, headers)) = match servers.get(&name) { - Some(server) => (&server.address, client(&server.token)), + Some(server) => (&server.address, client(&server.token).await), None => return Err(generic_error(Status::NotFound, string!("Server was not found"))), }; HTTP_COUNTER.inc(); timer.observe_duration(); - match client.get(fmtstr!("{address}/list")).headers(headers).send() { + match client.post(fmtstr!("{address}/process/{id}/action")).json(&body.0).headers(headers).send().await { Ok(data) => { if data.status() != 200 { - let err = data.json::<ErrorMessage>().unwrap(); + let err = data.json::<ErrorMessage>().await.unwrap(); Err(generic_error(err.code, err.message)) } else { - Ok(Json(data.json::<Vec<ProcessItem>>().unwrap())) + Ok(Json(data.json::<ActionResponse>().await.unwrap())) } } Err(err) => Err(generic_error(Status::InternalServerError, err.to_string())), } } else { Err(generic_error(Status::BadRequest, string!("No servers have been added"))) } } #[get("/daemon/dump")] #[utoipa::path(get, tag = "Daemon", path = "/daemon/dump", security((), ("api_key" = [])), responses( (status = 200, description = "Dump processes successfully", body = [u8]), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn dump_handler(_t: Token) -> Vec<u8> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["dump"]).start_timer(); HTTP_COUNTER.inc(); timer.observe_duration(); dump::raw() } #[get("/daemon/config")] #[utoipa::path(get, tag = "Daemon", path = "/daemon/config", security((), ("api_key" = [])), responses( (status = 200, description = "Get daemon config successfully", body = ConfigBody), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn config_handler(_t: Token) -> Json<ConfigBody> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["dump"]).start_timer(); let config = config::read().runner; HTTP_COUNTER.inc(); timer.observe_duration(); Json(ConfigBody { shell: config.shell, args: config.args, log_path: config.log_path, }) } #[get("/list")] #[utoipa::path(get, path = "/list", tag = "Process", security((), ("api_key" = [])), responses( (status = 200, description = "List processes successfully", body = [ProcessItem]), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn list_handler(_t: Token) -> Json<Vec<ProcessItem>> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["list"]).start_timer(); let data = Runner::new().fetch(); HTTP_COUNTER.inc(); timer.observe_duration(); Json(data) } #[get("/process/<id>/logs/<kind>")] #[utoipa::path(get, tag = "Process", path = "/process/{id}/logs/{kind}", security((), ("api_key" = [])), params( ("id" = usize, Path, description = "Process id to get logs for", example = 0), ("kind" = String, Path, description = "Log output type", example = "out") ), responses( (status = 200, description = "Process logs of {type} fetched", body = LogResponse), (status = NOT_FOUND, description = "Process was not found", body = ErrorMessage), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn logs_handler(id: usize, kind: String, _t: Token) -> Result<Json<LogResponse>, NotFound> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["log"]).start_timer(); HTTP_COUNTER.inc(); match Runner::new().info(id) { Some(item) => { let log_file = match kind.as_str() { "out" | "stdout" => item.logs().out, "error" | "stderr" => item.logs().error, _ => item.logs().out, }; match File::open(log_file) { Ok(data) => { let reader = BufReader::new(data); let logs: Vec<String> = reader.lines().collect::<io::Result<_>>().unwrap(); timer.observe_duration(); Ok(Json(LogResponse { logs })) } Err(_) => Ok(Json(LogResponse { logs: vec![] })), } } None => { timer.observe_duration(); Err(not_found("Process was not found")) } } } #[get("/process/<id>/logs/<kind>/raw")] #[utoipa::path(get, tag = "Process", path = "/process/{id}/logs/{kind}/raw", security((), ("api_key" = [])), params( ("id" = usize, Path, description = "Process id to get logs for", example = 0), ("kind" = String, Path, description = "Log output type", example = "out") ), responses( ( description = "Process logs of {type} fetched raw", body = String, status = 200, example = json!("# PATH path/of/file.log\nserver started on port 3000") ), (status = NOT_FOUND, description = "Process was not found", body = ErrorMessage), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn logs_raw_handler(id: usize, kind: String, _t: Token) -> Result<String, NotFound> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["log"]).start_timer(); HTTP_COUNTER.inc(); match Runner::new().info(id) { Some(item) => { let log_file = match kind.as_str() { "out" | "stdout" => item.logs().out, "error" | "stderr" => item.logs().error, _ => item.logs().out, }; let data = match fs::read_to_string(&log_file) { Ok(data) => format!("# PATH {log_file}\n{data}"), Err(err) => err.to_string(), }; timer.observe_duration(); Ok(data) } None => { timer.observe_duration(); Err(not_found("Process was not found")) } } } #[get("/process/<id>/info")] #[utoipa::path(get, tag = "Process", path = "/process/{id}/info", security((), ("api_key" = [])), params(("id" = usize, Path, description = "Process id to get information for", example = 0)), responses( (status = 200, description = "Current process info retrieved", body = ItemSingle), (status = NOT_FOUND, description = "Process was not found", body = ErrorMessage), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn info_handler(id: usize, _t: Token) -> Result<Json<ItemSingle>, NotFound> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["info"]).start_timer(); let runner = Runner::new(); if runner.exists(id) { let item = runner.get(id); HTTP_COUNTER.inc(); timer.observe_duration(); Ok(Json(item.fetch())) } else { Err(not_found("Process was not found")) } } #[post("/process/create", format = "json", data = "<body>")] #[utoipa::path(post, tag = "Process", path = "/process/create", request_body(content = CreateBody), security((), ("api_key" = [])), responses( ( description = "Create process successful", body = ActionResponse, example = json!({"action": "create", "done": true }), status = 200, ), (status = INTERNAL_SERVER_ERROR, description = "Failed to create process", body = ErrorMessage), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn create_handler(body: Json<CreateBody>, _t: Token) -> Result<Json<ActionResponse>, ()> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["create"]).start_timer(); let mut runner = Runner::new(); HTTP_COUNTER.inc(); let name = match &body.name { Some(name) => string!(name), None => string!(body.script.split_whitespace().next().unwrap_or_default()), }; runner.start(&name, &body.script, body.path.clone(), &body.watch).save(); timer.observe_duration(); Ok(Json(attempt(true, "create"))) } #[post("/process/<id>/rename", format = "text", data = "<body>")] #[utoipa::path(post, tag = "Process", path = "/process/{id}/rename", security((), ("api_key" = [])), request_body(content = String, example = json!("example_name")), params(("id" = usize, Path, description = "Process id to rename", example = 0)), responses( ( description = "Rename process successful", body = ActionResponse, example = json!({"action": "rename", "done": true }), status = 200, ), (status = NOT_FOUND, description = "Process was not found", body = ErrorMessage), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn rename_handler(id: usize, body: String, _t: Token) -> Result<Json<ActionResponse>, NotFound> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["rename"]).start_timer(); let runner = Runner::new(); match runner.clone().info(id) { Some(process) => { HTTP_COUNTER.inc(); let mut item = runner.get(id); item.rename(body.trim().replace("\n", "")); then!(process.running, item.restart()); timer.observe_duration(); Ok(Json(attempt(true, "rename"))) } None => { timer.observe_duration(); Err(not_found("Process was not found")) } } } #[get("/process/<id>/env")] #[utoipa::path(get, tag = "Process", path = "/process/{id}/env", params(("id" = usize, Path, description = "Process id to fetch env from", example = 0)), responses( ( description = "Current process env", body = HashMap<String, String>, example = json!({"ENV_TEST_VALUE": "example_value"}), status = 200 ), (status = NOT_FOUND, description = "Process was not found", body = ErrorMessage), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn env_handler(id: usize, _t: Token) -> Result<EnvList, NotFound> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["env"]).start_timer(); HTTP_COUNTER.inc(); match Runner::new().info(id) { Some(item) => { timer.observe_duration(); Ok(Json(item.clone().env)) } None => { timer.observe_duration(); Err(not_found("Process was not found")) } } } #[post("/process/<id>/action", format = "json", data = "<body>")] #[utoipa::path(post, tag = "Process", path = "/process/{id}/action", request_body = ActionBody, security((), ("api_key" = [])), params(("id" = usize, Path, description = "Process id to run action on", example = 0)), responses( (status = 200, description = "Run action on process successful", body = ActionResponse), (status = NOT_FOUND, description = "Process/action was not found", body = ErrorMessage), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn action_handler(id: usize, body: Json<ActionBody>, _t: Token) -> Result<Json<ActionResponse>, NotFound> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["action"]).start_timer(); let mut runner = Runner::new(); let method = body.method.as_str(); if runner.exists(id) { HTTP_COUNTER.inc(); match method { "start" | "restart" => { runner.get(id).restart(); timer.observe_duration(); Ok(Json(attempt(true, method))) } "stop" | "kill" => { runner.get(id).stop(); timer.observe_duration(); Ok(Json(attempt(true, method))) } "remove" | "delete" => { runner.remove(id); timer.observe_duration(); Ok(Json(attempt(true, method))) } _ => { timer.observe_duration(); Err(not_found("Process was not found")) } } } else { Err(not_found("Process was not found")) } } #[get("/daemon/metrics")] #[utoipa::path(get, tag = "Daemon", path = "/daemon/metrics", security((), ("api_key" = [])), responses( (status = 200, description = "Get daemon metrics", body = MetricsRoot), ( status = UNAUTHORIZED, description = "Authentication failed or not provided", body = ErrorMessage, example = json!({"code": 401, "message": "Unauthorized"}) ) ) )] pub async fn metrics_handler(_t: Token) -> Json<MetricsRoot> { let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["metrics"]).start_timer(); let mut pid: Option<i32> = None; let mut cpu_percent: Option<f32> = None; let mut uptime: Option<DateTime<Utc>> = None; let mut memory_usage: Option<MemoryInfo> = None; let mut runner: Runner = file::read_rmp(global!("pmc.dump")); HTTP_COUNTER.inc(); if pid::exists() { if let Ok(process_id) = pid::read() { if let Ok(mut process) = Process::new(process_id as u32) { pid = Some(process_id); uptime = Some(pid::uptime().unwrap()); memory_usage = process.memory_info().ok(); cpu_percent = process.cpu_percent().ok(); } } } let memory_usage = match memory_usage { Some(usage) => helpers::format_memory(usage.rss()), None => string!("0b"), }; let cpu_percent = match cpu_percent { Some(percent) => format!("{:.2}%", percent), None => string!("0%"), }; let uptime = match uptime { Some(uptime) => helpers::format_duration(uptime), None => string!("none"), }; timer.observe_duration(); Json(MetricsRoot { version: Version { pkg: format!("v{}", env!("CARGO_PKG_VERSION")), hash: env!("GIT_HASH_FULL"), build_date: env!("BUILD_DATE"), target: env!("PROFILE"), }, daemon: Daemon { pid, uptime, running: pid::exists(), process_count: runner.count(), daemon_type: global!("pmc.daemon.kind"), stats: Stats { memory_usage, cpu_percent }, }, }) } diff --git a/src/main.rs b/src/main.rs index 8173d5e..6702097 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,175 +1,176 @@ mod cli; mod daemon; mod globals; mod webui; use crate::cli::Args; use clap::{Parser, Subcommand}; use clap_verbosity_flag::{LogLevel, Verbosity}; use macros_rs::{str, string, then}; fn validate_id_script(s: &str) -> Result<Args, String> { if let Ok(id) = s.parse::<usize>() { Ok(Args::Id(id)) } else { Ok(Args::Script(s.to_owned())) } } #[derive(Copy, Clone, Debug, Default)] struct NoneLevel; impl LogLevel for NoneLevel { fn default() -> Option<log::Level> { None } } #[derive(Parser)] #[command(version = str!(cli::get_version(false)))] struct Cli { + /// test #[command(subcommand)] command: Commands, #[clap(flatten)] verbose: Verbosity<NoneLevel>, } #[derive(Subcommand)] enum Daemon { /// Reset process index #[command(alias = "clean")] Reset, /// Stop daemon #[command(alias = "kill")] Stop, /// Restart daemon #[command(alias = "restart", alias = "start")] Restore { /// Daemon api #[arg(long)] api: bool, /// WebUI using api #[arg(long)] webui: bool, }, /// Check daemon #[command(alias = "info", alias = "status")] Health { /// Format output #[arg(long, default_value_t = string!("default"))] format: String, }, } // add pmc restore command #[derive(Subcommand)] enum Commands { /// Start/Restart a process #[command(alias = "restart")] Start { /// Process name #[arg(long)] name: Option<String>, #[clap(value_parser = validate_id_script)] args: Option<Args>, /// Watch to reload path #[arg(long)] watch: Option<String>, /// Server #[arg(short, long, default_value_t = string!("internal"))] server: String, }, /// Stop/Kill a process #[command(alias = "kill")] Stop { id: usize, /// Server #[arg(short, long, default_value_t = string!("internal"))] server: String, }, /// Stop then remove a process #[command(alias = "rm")] Remove { id: usize, /// Server #[arg(short, long, default_value_t = string!("internal"))] server: String, }, /// Get env of a process #[command(alias = "cmdline")] Env { id: usize, /// Server #[arg(short, long, default_value_t = string!("internal"))] server: String, }, /// Get information of a process #[command(alias = "info")] Details { id: usize, /// Format output #[arg(long, default_value_t = string!("default"))] format: String, /// Server #[arg(short, long, default_value_t = string!("internal"))] server: String, }, /// List all processes #[command(alias = "ls")] List { /// Format output #[arg(long, default_value_t = string!("default"))] format: String, /// Server #[arg(short, long, default_value_t = string!("all"))] server: String, }, /// Get logs from a process Logs { id: usize, #[arg(long, default_value_t = 15, help = "")] lines: usize, /// Server #[arg(short, long, default_value_t = string!("internal"))] server: String, }, /// Daemon management Daemon { #[command(subcommand)] command: Daemon, }, } fn main() { let cli = Cli::parse(); let mut env = env_logger::Builder::new(); let level = cli.verbose.log_level_filter(); globals::init(); env.filter_level(level).init(); match &cli.command { Commands::Start { name, args, watch, server } => cli::start(name, args, watch, server), Commands::Stop { id, server } => cli::stop(id, server), Commands::Remove { id, server } => cli::remove(id, server), Commands::Env { id, server } => cli::env(id, server), Commands::Details { id, format, server } => cli::info(id, format, server), Commands::List { format, server } => cli::list(format, server), Commands::Logs { id, lines, server } => cli::logs(id, lines, server), Commands::Daemon { command } => match command { Daemon::Stop => daemon::stop(), Daemon::Reset => daemon::reset(), Daemon::Health { format } => daemon::health(format), Daemon::Restore { api, webui } => daemon::restart(api, webui, level.as_str() != "OFF"), }, }; if !matches!(&cli.command, Commands::Daemon { .. }) { then!(!daemon::pid::exists(), daemon::restart(&false, &false, false)); } } diff --git a/src/process/http.rs b/src/process/http.rs index ffdde27..008fddf 100644 --- a/src/process/http.rs +++ b/src/process/http.rs @@ -1,84 +1,101 @@ use crate::process::Remote; -use macros_rs::{fmtstr, str, string}; -use reqwest::blocking::{Client, Response}; +use macros_rs::{fmtstr, string}; use reqwest::header::{HeaderMap, HeaderValue}; +use reqwest::Client; use serde::Serialize; use std::path::PathBuf; #[derive(Serialize)] struct ActionBody { pub method: String, } pub struct LogResponse { pub path: &'static str, pub lines: Vec<String>, } #[derive(Serialize)] struct CreateBody<'c> { pub name: &'c String, pub script: &'c String, pub path: PathBuf, pub watch: &'c Option<String>, } -pub fn client(token: &Option<String>) -> (Client, HeaderMap) { +pub mod sync { + use reqwest::blocking::Client; + use reqwest::header::{HeaderMap, HeaderValue}; + + pub use reqwest::blocking::Response; + pub fn client(token: &Option<String>) -> (Client, HeaderMap) { + let client = Client::new(); + let mut headers = HeaderMap::new(); + + if let Some(token) = token { + headers.insert("token", HeaderValue::from_str(&token).unwrap()); + } + + return (client, headers); + } +} + +pub async fn client(token: &Option<String>) -> (Client, HeaderMap) { let client = Client::new(); let mut headers = HeaderMap::new(); if let Some(token) = token { - headers.insert("token", HeaderValue::from_static(str!(token.to_owned()))); + headers.insert("token", HeaderValue::from_str(&token).unwrap()); } return (client, headers); } -pub fn info(Remote { address, token, .. }: &Remote, id: usize) -> Result<Response, anyhow::Error> { - let (client, headers) = client(token); +pub fn info(Remote { address, token, .. }: &Remote, id: usize) -> Result<sync::Response, anyhow::Error> { + let (client, headers) = sync::client(token); Ok(client.get(fmtstr!("{address}/process/{id}/info")).headers(headers).send()?) } pub fn logs(Remote { address, token, .. }: &Remote, id: usize, kind: &str) -> Result<LogResponse, anyhow::Error> { - let (client, headers) = client(token); + let (client, headers) = sync::client(token); let response = client.get(fmtstr!("{address}/process/{id}/logs/{kind}/raw")).headers(headers).send()?; let log = response.text()?; Ok(LogResponse { lines: log.lines().skip(1).map(|line| line.to_string()).collect::<Vec<String>>(), path: Box::leak(Box::from(log.lines().next().unwrap_or("").split_whitespace().last().unwrap_or(""))), }) } -pub fn create(Remote { address, token, .. }: &Remote, name: &String, script: &String, path: PathBuf, watch: &Option<String>) -> Result<Response, anyhow::Error> { - let (client, headers) = client(token); +pub fn create(Remote { address, token, .. }: &Remote, name: &String, script: &String, path: PathBuf, watch: &Option<String>) -> Result<sync::Response, anyhow::Error> { + let (client, headers) = sync::client(token); let content = CreateBody { name, script, path, watch }; Ok(client.post(fmtstr!("{address}/process/create")).json(&content).headers(headers).send()?) } -pub fn restart(Remote { address, token, .. }: &Remote, id: usize) -> Result<Response, anyhow::Error> { - let (client, headers) = client(token); +pub fn restart(Remote { address, token, .. }: &Remote, id: usize) -> Result<sync::Response, anyhow::Error> { + let (client, headers) = sync::client(token); let content = ActionBody { method: string!("restart") }; Ok(client.post(fmtstr!("{address}/process/{id}/action")).json(&content).headers(headers).send()?) } -pub fn rename(Remote { address, token, .. }: &Remote, id: usize, name: String) -> Result<Response, anyhow::Error> { - let (client, headers) = client(token); +pub fn rename(Remote { address, token, .. }: &Remote, id: usize, name: String) -> Result<sync::Response, anyhow::Error> { + let (client, headers) = sync::client(token); Ok(client.post(fmtstr!("{address}/process/{id}/rename")).body(name).headers(headers).send()?) } -pub fn stop(Remote { address, token, .. }: &Remote, id: usize) -> Result<Response, anyhow::Error> { - let (client, headers) = client(token); +pub fn stop(Remote { address, token, .. }: &Remote, id: usize) -> Result<sync::Response, anyhow::Error> { + let (client, headers) = sync::client(token); let content = ActionBody { method: string!("stop") }; Ok(client.post(fmtstr!("{address}/process/{id}/action")).json(&content).headers(headers).send()?) } -pub fn remove(Remote { address, token, .. }: &Remote, id: usize) -> Result<Response, anyhow::Error> { - let (client, headers) = client(token); +pub fn remove(Remote { address, token, .. }: &Remote, id: usize) -> Result<sync::Response, anyhow::Error> { + let (client, headers) = sync::client(token); let content = ActionBody { method: string!("remove") }; Ok(client.post(fmtstr!("{address}/process/{id}/action")).json(&content).headers(headers).send()?) }