From ea16f34c73339a6bf0114a53e2055289991b5385 Mon Sep 17 00:00:00 2001 From: Hector van der Aa Date: Sat, 13 Dec 2025 01:21:52 +0100 Subject: [PATCH] Initial rewrite start --- Cargo.lock | 1425 +----------------------------------- Cargo.toml | 42 +- src/config/config.rs | 26 + src/config/mod.rs | 5 +- src/config/stream/event.rs | 93 --- src/config/stream/line.rs | 72 -- src/config/stream/log.rs | 99 --- src/config/stream/mod.rs | 10 - src/config/version.rs | 149 +--- src/error.rs | 158 +--- src/instance/handle.rs | 612 +++++----------- src/instance/mod.rs | 7 +- src/instance/types.rs | 12 - src/lib.rs | 11 +- src/manifests/mod.rs | 1 - src/manifests/vanilla.rs | 114 --- src/parser/mod.rs | 26 - src/server/domain.rs | 248 ------- src/server/mod.rs | 16 +- src/utils.rs | 24 - 20 files changed, 309 insertions(+), 2841 deletions(-) create mode 100644 src/config/config.rs delete mode 100644 src/config/stream/event.rs delete mode 100644 src/config/stream/line.rs delete mode 100644 src/config/stream/log.rs delete mode 100644 src/config/stream/mod.rs delete mode 100644 src/manifests/mod.rs delete mode 100644 src/manifests/vanilla.rs delete mode 100644 src/parser/mod.rs delete mode 100644 src/server/domain.rs delete mode 100644 src/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 366a32a..672a422 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,59 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[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 = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" - [[package]] name = "bumpalo" version = "3.19.0" @@ -67,198 +14,24 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" -[[package]] -name = "cc" -version = "1.2.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" -dependencies = [ - "find-msvc-tools", - "shlex", -] - [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "chrono" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-link", -] - -[[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.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "find-msvc-tools" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", -] - [[package]] name = "futures-core" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "futures-sink" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-core", - "futures-macro", - "futures-task", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "getrandom" version = "0.3.4" @@ -271,308 +44,6 @@ dependencies = [ "wasip2", ] -[[package]] -name = "h2" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - -[[package]] -name = "http" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hyper" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "system-configuration", - "tokio", - "tower-service", - "tracing", - "windows-registry", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "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 = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "itoa" version = "1.0.15" @@ -595,24 +66,6 @@ version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" - [[package]] name = "memchr" version = "2.7.6" @@ -620,63 +73,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mineguard" +name = "mgrewrite" version = "0.1.0" dependencies = [ - "async-trait", - "chrono", - "regex", - "reqwest", "serde", "serde_json", "thiserror", "tokio", - "tokio-stream", "tokio-util", "uuid", ] [[package]] name = "mio" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", + "windows-sys", ] [[package]] @@ -685,83 +101,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "openssl" -version = "0.10.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" -dependencies = [ - "bitflags", - "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", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" -[[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.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - [[package]] name = "proc-macro2" version = "1.0.103" @@ -786,135 +131,6 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "regex" -version = "1.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" - -[[package]] -name = "reqwest" -version = "0.12.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime", - "native-tls", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" -dependencies = [ - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - [[package]] name = "rustversion" version = "1.0.22" @@ -927,38 +143,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "serde" version = "1.0.228" @@ -1002,24 +186,6 @@ dependencies = [ "serde_core", ] -[[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 = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "signal-hook-registry" version = "1.4.7" @@ -1029,40 +195,6 @@ dependencies = [ "libc", ] -[[package]] -name = "slab" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "socket2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - [[package]] name = "syn" version = "2.0.111" @@ -1074,60 +206,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" -dependencies = [ - "fastrand", - "getrandom 0.3.4", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - [[package]] name = "thiserror" version = "2.0.17" @@ -1148,16 +226,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "tokio" version = "1.48.0" @@ -1169,52 +237,7 @@ dependencies = [ "mio", "pin-project-lite", "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[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-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", + "windows-sys", ] [[package]] @@ -1225,142 +248,29 @@ checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", - "futures-io", "futures-sink", - "futures-util", - "hashbrown 0.15.5", "pin-project-lite", - "slab", "tokio", ] -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" -dependencies = [ - "bitflags", - "bytes", - "futures-util", - "http", - "http-body", - "iri-string", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "unicode-ident" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "uuid" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ - "getrandom 0.3.4", + "getrandom", "js-sys", "serde_core", "wasm-bindgen", ] -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[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.1+wasi-snapshot-preview1" @@ -1389,19 +299,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.106" @@ -1434,104 +331,12 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "web-sys" -version = "0.3.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[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.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -1541,226 +346,8 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "wit-bindgen" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/Cargo.toml b/Cargo.toml index 7e3598f..d7add6b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,36 +1,26 @@ [package] -name = "mineguard" +name = "mgrewrite" version = "0.1.0" edition = "2024" -description = "Opinionated Minecraft server supervisor engine built primarily for RustyMine" -readme = "README.md" -homepage = "https://mineguard.h3cx.dev" -repository = "https://github.com/H3ct0r55/MineGuard" -license = "MIT" -# publish set to false during development -publish = false [features] -default = ["core", "events", "mc-vanilla"] -# Core runtime requirements for the currently implemented functionality. -core = ["dep:thiserror", "dep:tokio", "dep:tokio-stream", "dep:tokio-util"] -# Placeholder for upcoming event-driven functionality. -events = ["dep:uuid", "dep:chrono", "dep:regex"] +default = ["core", "mc-vanilla"] -mc-vanilla = ["dep:serde", "dep:serde_json", "dep:reqwest"] -# Add new feature groups here; attach their optional dependencies to the relevant feature list. +core = ["dep:serde", "dep:serde_json", "dep:uuid", "dep:tokio", "dep:tokio-util"] + +version-custom = [] + +events = [] + +mc-vanilla = [] + +mc-paper = [] +tokio = ["dep:tokio"] [dependencies] -async-trait = "0.1.89" -chrono = {version = "0.4.42", optional = true} -regex = {version = "1.12.2", optional = true} -reqwest = { version = "0.12.24", optional = true, features = ["json"] } -serde = { version = "1.0.228", optional = true, features = ["derive"] } +serde = { version = "1.0.228", features = ["derive"], optional = true } serde_json = {version = "1.0.145", optional = true} -thiserror = { version = "2.0.17", optional = true } -# Core async runtime and utilities -# Add new feature-specific optional dependencies alongside the relevant feature entry above. -tokio = { version = "1.48.0", features = ["process", "rt-multi-thread", "macros", "io-std", "io-util"], optional = true } -tokio-stream = { version = "0.1.17", features = ["full", "io-util", "signal", "tokio-util"], optional = true } -tokio-util = { version = "0.7.17", features = ["full"], optional = true } +thiserror = "2.0.17" +tokio = { version = "1.48.0", features = ["fs", "io-std", "io-util", "process", "rt-multi-thread"], optional = true } +tokio-util ={version = "0.7.17", optional = true} uuid = { version = "1.19.0", features = ["serde", "v4"], optional = true } diff --git a/src/config/config.rs b/src/config/config.rs new file mode 100644 index 0000000..029d011 --- /dev/null +++ b/src/config/config.rs @@ -0,0 +1,26 @@ +use std::path::PathBuf; + +use uuid::Uuid; + +use crate::config::version::{MinecraftType, MinecraftVersion}; + +#[derive(Debug, Clone)] +pub struct ServerConfig { + pub uuid: Uuid, + pub core_path: PathBuf, + pub jar_path: PathBuf, + pub mc_version: MinecraftVersion, + pub mc_type: MinecraftType, +} + +impl ServerConfig { + pub fn new() -> Self { + Self { + uuid: Uuid::new_v4(), + core_path: PathBuf::new(), + jar_path: PathBuf::new(), + mc_version: MinecraftVersion::Unknown, + mc_type: MinecraftType::Unknown, + } + } +} diff --git a/src/config/mod.rs b/src/config/mod.rs index b2400a1..ee65768 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -1,5 +1,2 @@ -pub mod stream; +pub mod config; pub mod version; - -pub use stream::{LogMeta, StreamLine, StreamSource}; -pub use version::{MinecraftType, MinecraftVersion, Snapshot, Version}; diff --git a/src/config/stream/event.rs b/src/config/stream/event.rs deleted file mode 100644 index 777865c..0000000 --- a/src/config/stream/event.rs +++ /dev/null @@ -1,93 +0,0 @@ -use std::fmt::{self, Display}; - -use uuid::{Uuid, timestamp}; - -use crate::instance::InstanceStatus; - -use super::line::StreamLine; - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum EventPayload { - #[cfg(feature = "events")] - StateChange { - old: InstanceStatus, - new: InstanceStatus, - }, - - StdLine { - line: StreamLine, - }, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct InstanceEvent { - pub id: Uuid, - - pub timestamp: chrono::DateTime, - - pub payload: EventPayload, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum InternalEvent { - ServerStarted, -} - -impl InstanceEvent { - pub fn stdout>(line: S) -> Self { - let line = line.into(); - let s_line = StreamLine::stdout(line); - let timestamp = s_line.extract_timestamp().unwrap_or(chrono::Utc::now()); - let payload = EventPayload::StdLine { line: s_line }; - - Self { - id: Uuid::new_v4(), - timestamp, - payload, - } - } - - pub fn stderr>(line: S) -> Self { - let line = line.into(); - let s_line = StreamLine::stderr(line); - let timestamp = s_line.extract_timestamp().unwrap_or(chrono::Utc::now()); - let payload = EventPayload::StdLine { line: s_line }; - - Self { - id: Uuid::new_v4(), - timestamp, - payload, - } - } - - pub fn new(payload: EventPayload) -> Self { - let timestamp = chrono::Utc::now(); - - Self { - id: Uuid::new_v4(), - timestamp, - payload, - } - } -} - -impl Display for InstanceEvent { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let head = format!( - "UUID: {}\nTimestamp:{}\nPayload:\n", - self.id, self.timestamp - ); - match self.payload.clone() { - EventPayload::StdLine { line } => { - let full = format!("{}{}", head, line); - writeln!(f, "{}", full) - } - - #[cfg(feature = "events")] - EventPayload::StateChange { old, new } => { - let full = format!("{}State changed: {:?} -> {:?}", head, old, new); - writeln!(f, "{}", full) - } - } - } -} diff --git a/src/config/stream/line.rs b/src/config/stream/line.rs deleted file mode 100644 index d44aba2..0000000 --- a/src/config/stream/line.rs +++ /dev/null @@ -1,72 +0,0 @@ -use std::fmt::{self, Display}; - -use regex::Regex; - -#[cfg(feature = "events")] -use chrono::{DateTime, Local, NaiveTime, TimeZone, Utc}; - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum StreamSource { - Stdout, - Stderr, - #[cfg(feature = "events")] - Event, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct StreamLine { - pub line: String, - pub source: StreamSource, -} - -impl StreamLine { - pub fn new>(line: S, source: StreamSource) -> Self { - let line = line.into(); - let re = Regex::new(r#"^\[[^\]]*\]\s*\[[^\]]*\]:\s*"#).unwrap(); - let line = re.replace(&line, "").to_string(); - Self { line, source } - } - - pub fn stdout>(line: S) -> Self { - let line = line.into(); - Self { - line, - source: StreamSource::Stdout, - } - } - - pub fn stderr>(line: S) -> Self { - let line = line.into(); - Self { - line, - source: StreamSource::Stderr, - } - } - - pub fn msg(&self) -> String { - self.line.clone() - } - - pub fn extract_timestamp(&self) -> Option> { - let input = self.line.as_str(); - let re = Regex::new(r"\[(.*?)\]").unwrap(); - let time_s = re.captures(input).map(|v| v[1].to_string()); - time_s.as_ref()?; - let time = NaiveTime::parse_from_str(&time_s.unwrap(), "%H:%M:%S").ok()?; - - let today = Local::now().date_naive(); - let naive_dt = today.and_time(time); - - let local_dt = Local.from_local_datetime(&naive_dt).unwrap(); - - let utc_dt = local_dt.with_timezone(&Utc); - - Some(utc_dt) - } -} - -impl Display for StreamLine { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.line) - } -} diff --git a/src/config/stream/log.rs b/src/config/stream/log.rs deleted file mode 100644 index 9449d49..0000000 --- a/src/config/stream/log.rs +++ /dev/null @@ -1,99 +0,0 @@ -use std::fmt::{self, Display}; - -use crate::error::ParserError; - -#[cfg(feature = "mc-vanilla")] -pub struct LogMeta { - pub time: String, - pub thread: String, - pub level: LogLevel, - pub msg: String, -} - -#[cfg(feature = "mc-vanilla")] -#[derive(Debug, Clone, Eq, PartialEq)] -pub enum LogLevel { - Info, - Warn, - Error, - Other, -} - -#[cfg(feature = "mc-vanilla")] -impl LogMeta { - pub fn new>(line: S) -> Result, ParserError> { - let line: String = line.into(); - let line = line.trim(); - - if !line.starts_with('[') { - return Ok(None); - } - - let time_end = match line.find(']') { - Some(i) => i, - None => return Ok(None), - }; - let time = line[1..time_end].to_string(); - - let meta_start = match line[time_end + 1..].find('[') { - Some(j) => time_end + 1 + j, - None => return Ok(None), - }; - - let msg_sep = match line[meta_start..].find("]: ") { - Some(k) => meta_start + k, - None => return Ok(None), - }; - - let meta = &line[(meta_start + 1)..msg_sep]; // inside the brackets - let msg = line[(msg_sep + 3)..].to_string(); // after "]: " - - let mut thread_level = meta.splitn(2, '/'); - let thread = thread_level - .next() - .ok_or(ParserError::ParserError)? - .to_string(); - let level_str = thread_level - .next() - .ok_or(ParserError::ParserError)? - .trim_end_matches(']'); // just in case - - let level = match level_str { - "INFO" => LogLevel::Info, - "WARN" => LogLevel::Warn, - "ERROR" => LogLevel::Error, - _ => LogLevel::Other, - }; - - Ok(Some(LogMeta { - time, - thread, - level, - msg, - })) - } -} - -#[cfg(feature = "mc-vanilla")] -impl Display for LogMeta { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let line = format!( - "Time: {}\nThread: {}\nLevel: {}\nMessage: {}", - self.time, self.thread, self.level, self.msg - ); - - write!(f, "{}", line) - } -} - -#[cfg(feature = "mc-vanilla")] -impl Display for LogLevel { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - LogLevel::Info => write!(f, "INFO"), - LogLevel::Warn => write!(f, "WARN"), - LogLevel::Error => write!(f, "ERROR"), - LogLevel::Other => write!(f, "OTHER"), - } - } -} diff --git a/src/config/stream/mod.rs b/src/config/stream/mod.rs deleted file mode 100644 index 8685fc1..0000000 --- a/src/config/stream/mod.rs +++ /dev/null @@ -1,10 +0,0 @@ -mod event; -mod line; -#[cfg(feature = "mc-vanilla")] -mod log; - -pub use event::InternalEvent; -pub use event::{EventPayload, InstanceEvent}; -pub use line::{StreamLine, StreamSource}; -#[cfg(feature = "mc-vanilla")] -pub use log::{LogLevel, LogMeta}; diff --git a/src/config/version.rs b/src/config/version.rs index 37d00c6..9e7bac1 100644 --- a/src/config/version.rs +++ b/src/config/version.rs @@ -1,142 +1,23 @@ -use std::{ - fmt::{self, Display}, - str::FromStr, -}; - -use serde::{Deserialize, Serialize}; -use tokio::sync::watch; - -use crate::error::VersionError; - -/// Identifies the type of Minecraft distribution supported by the configuration. -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] -pub enum MinecraftType { - Vanilla, -} - -/// Semantic release version parsed from strings like `1.20.4`. -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] +#[derive(Debug, Clone)] pub struct Version { - pub major: u32, - pub minor: u32, - pub patch: u32, + major: u32, + minor: u32, + patch: u32, } -/// Snapshot version parsed from strings like `23w13b`. -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] -pub struct Snapshot { - pub year: u32, - pub week: u32, - pub build: char, -} - -/// Enum covering both release and snapshot Minecraft version formats. -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] +#[derive(Debug, Clone)] pub enum MinecraftVersion { + Unknown, Release(Version), - Snapshot(Snapshot), + #[cfg(feature = "version-custom")] + Custom(String), } -impl Display for Version { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}.{}.{}", self.major, self.minor, self.patch) - } -} - -impl Display for Snapshot { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}w{:02}{}", self.year, self.week, self.build) - } -} - -impl Display for MinecraftVersion { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - MinecraftVersion::Release(version) => write!(f, "{}", version.to_string()), - MinecraftVersion::Snapshot(snapshot) => write!(f, "{}", snapshot.to_string()), - } - } -} - -impl FromStr for Version { - type Err = VersionError; - - fn from_str(s: &str) -> Result { - let mut split = s.split('.'); - - let major_str = split.next().ok_or(VersionError::MissingMajor)?; - let minor_str = split.next().ok_or(VersionError::MissingMinor)?; - let patch_str = split.next().ok_or(VersionError::MissingPatch)?; - - if split.next().is_some() { - return Err(VersionError::ExtraComponents); - } - - let major = major_str - .parse::() - .map_err(|_| VersionError::IncorrectMajor(major_str.to_string()))?; - - let minor = minor_str - .parse::() - .map_err(|_| VersionError::IncorrectMinor(minor_str.to_string()))?; - - let patch = patch_str - .parse::() - .map_err(|_| VersionError::IncorrectPatch(patch_str.to_string()))?; - - Ok(Self { - major, - minor, - patch, - }) - } -} - -impl FromStr for Snapshot { - type Err = VersionError; - - fn from_str(s: &str) -> Result { - let (year_str, rest) = s - .split_once('w') - .ok_or(VersionError::InvalidSnapshotFormat)?; - - if rest.len() < 3 { - return Err(VersionError::InvalidSnapshotFormat); - } - - let week_str = &rest[..2]; - let build_str = &rest[2..]; - - let year = year_str - .parse::() - .map_err(|_| VersionError::IncorrectYear(year_str.to_string()))?; - - let week = week_str - .parse::() - .map_err(|_| VersionError::IncorrectWeek(week_str.to_string()))?; - - let build = if build_str.len() == 1 { - build_str.chars().next().unwrap() - } else { - return Err(VersionError::IncorrectBuild(build_str.to_string())); - }; - - Ok(Self { year, week, build }) - } -} - -impl FromStr for MinecraftVersion { - type Err = VersionError; - - fn from_str(s: &str) -> Result { - if let Ok(ver) = Version::from_str(s) { - return Ok(MinecraftVersion::Release(ver)); - } - - if let Ok(snap) = Snapshot::from_str(s) { - return Ok(MinecraftVersion::Snapshot(snap)); - } - - Err(VersionError::UnknownVersionFormat(s.to_string())) - } +#[derive(Debug, Clone)] +pub enum MinecraftType { + Unknown, + #[cfg(feature = "mc-vanilla")] + Vanilla, + #[cfg(feature = "mc-paper")] + Paper, } diff --git a/src/error.rs b/src/error.rs index 1d2035d..91f5582 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,137 +1,33 @@ use thiserror::Error; -#[derive(Debug, Clone, Error)] -pub enum Error { - #[error("Undefined error")] - Generic, -} - -#[derive(Debug, Clone, Error)] -pub enum VersionError { - #[error("Incorrect major version: {0}")] - IncorrectMajor(String), - - #[error("Incorrect minor version: {0}")] - IncorrectMinor(String), - - #[error("Incorrect patch version: {0}")] - IncorrectPatch(String), - - #[error("Incorrect major version: {0}")] - IncorrectYear(String), - - #[error("Incorrect minor version: {0}")] - IncorrectWeek(String), - - #[error("Incorrect patch version: {0}")] - IncorrectBuild(String), - - #[error("Missing major version")] - MissingMajor, - - #[error("Missing minor version")] - MissingMinor, - - #[error("Missing patch version")] - MissingPatch, - - #[error("Invalid snapshot format")] - InvalidSnapshotFormat, - - #[error("Too many components")] - ExtraComponents, - - #[error("Unrecognized version format: {0}")] - UnknownVersionFormat(String), -} - -#[derive(Debug, Clone, Error)] +#[derive(Error, Debug)] pub enum HandleError { - #[error("Invalid Minecraft Version: {0}")] - InvalidVersion(String), + #[error("internal library error, this shouldn't happen")] + InternalError, - #[error("Invalid server root directory: {0}")] - InvalidDirectory(String), + #[error("failed to start handle, not stopped")] + StartFailedNotStopped, - #[error("Invalid relative JAR path: {0}")] - InvalidPathJAR(String), -} - -#[derive(Debug, Clone, Error)] -pub enum SubscribeError { - #[error("No stdout found")] - NoStdout, - - #[error("No stderr found")] - NoStderr, -} - -#[derive(Debug, Clone, Error)] -pub enum ServerError { - #[error("Server is already running")] - AlreadyRunning, - - #[error("Server is not running")] - NotRunning, - - #[error("Server crashed early")] - EarlyCrash, - - #[error("Failed to run java command")] - CommandFailed, - - #[error("Failed to access child stdout pipe")] - NoStdoutPipe, - - #[error("Failed to access child stdin pipe")] - NoStdinPipe, - - #[error("Failed to access child stderr pipe")] - NoStderrPipe, - - #[error("Failed to write to stdin")] - StdinWriteFailed, - - #[error("Failed to open eula.txt")] - NoEULA, - #[error("Failed to write eula.txt")] - WriteEULAFailed, - - #[error("File io error")] - FileIO, -} - -#[cfg(feature = "events")] -#[derive(Debug, Clone, Error)] -pub enum ParserError { - #[error("ParserError")] - ParserError, -} - -#[derive(Debug, Clone, Error)] -pub enum CreationError { - #[error("CreationError")] - CreationError, - - #[error("Invalid directory")] - DirectoryError, - - #[error("Failed to parse manifest")] - ManifestError, - - #[error("Version does not exist")] - VersionError, - - #[error("Network Error")] - NetworkError, -} -#[derive(Debug, Clone, Error)] -pub enum ManifestError { - #[error("ManifestError")] - ManifestError, - - #[error("Failed to load mainfest")] - LoadUrlError, - #[error("Failed to parse manifest json")] - JsonParseError, + #[error("failed to stop handle, not running")] + StopFailedNotRunning, + + #[error("failed to start handle, child exists")] + StartFailedChildExists, + #[error("failed to stop handle, child doesn't exists")] + StopFailedChildNotExists, + + #[error("failed to kill handle, child doesn't exists")] + KillFailedChildNotExists, + + #[error("failed to kill handle, internal error")] + KillFailledInternal, + + #[error("failed to start pumps, child inexistant")] + PumpsFailedNoChild, + + #[error("failed to start pumps, no stdout in child")] + PumpsFailedNoStdout, + + #[error("failed to start pumps, no stderr in child")] + PumpsFailedNoStderr, } diff --git a/src/instance/handle.rs b/src/instance/handle.rs index 7cc90f4..e276853 100644 --- a/src/instance/handle.rs +++ b/src/instance/handle.rs @@ -1,451 +1,231 @@ -use std::{path::PathBuf, process::Stdio, sync::Arc, time::Duration}; +use std::{process::Stdio, sync::Arc}; -use chrono::Utc; use tokio::{ - io::{AsyncBufReadExt, AsyncWriteExt, BufReader, BufWriter}, - process::{self, Child}, - sync::{RwLock, broadcast, mpsc}, - time::sleep, + io::{AsyncBufReadExt, BufReader}, + process::{Child, Command}, + sync::{broadcast, RwLock}, }; -use tokio_stream::StreamExt; -use tokio_stream::wrappers::BroadcastStream; use tokio_util::sync::CancellationToken; -use uuid::Uuid; -#[cfg(feature = "events")] -use crate::config::stream::InstanceEvent; -use crate::{ - config::{ - MinecraftType, MinecraftVersion, StreamSource, - stream::{EventPayload, InternalEvent}, - }, - error::{HandleError, ServerError, SubscribeError}, - server::domain::MineGuardConfig, -}; - -use super::{InstanceData, InstanceStatus}; +use crate::{config::config::ServerConfig, error::HandleError, instance::types::InstanceStatus}; #[derive(Debug)] pub struct InstanceHandle { - pub data: InstanceData, - pub status: Arc>, - stdout_tx: broadcast::Sender, - stderr_tx: Option>, - #[cfg(feature = "events")] - events_tx: broadcast::Sender, - #[cfg(feature = "events")] - internal_events_tx: mpsc::Sender, - #[cfg(feature = "events")] - internal_events_rx: Option>, - stdin_tx: mpsc::Sender, - stdin_rx: Option>, + config: Arc>, + status: Arc>, child: Option>>, shutdown: CancellationToken, - internal_bus_tx: broadcast::Sender, + stdout_tx: broadcast::Sender, + stderr_tx: broadcast::Sender, } impl InstanceHandle { - pub fn new_with_config(config: MineGuardConfig) -> Result { - InstanceHandle::new_with_params( - config.server_dir, - config.jar_path, - config.mc_version, - config.mc_type, - ) - } - pub fn new_with_params( - root_dir: PathBuf, - jar_path: PathBuf, - mc_version: MinecraftVersion, - mc_type: MinecraftType, - ) -> Result { - let parsed_version: MinecraftVersion = mc_version; - - let root: PathBuf = root_dir.clone().into(); - if !root.exists() || !root.is_dir() { - return Err(HandleError::InvalidDirectory( - root_dir.to_str().unwrap().to_string(), - )); - } - - let path: PathBuf = jar_path.clone().into(); - let conc = root.join(path.clone()); - if !path.is_relative() || !conc.is_file() { - return Err(HandleError::InvalidPathJAR( - jar_path.to_str().unwrap().to_string(), - )); - } - - let data = InstanceData { - root_dir: root, - jar_path: path, - mc_version: parsed_version, - mc_type, - }; - - let status = InstanceStatus::Stopped; - - let (stdin_tx, stdin_rx) = mpsc::channel(1024); - let (internal_tx, internal_rx) = mpsc::channel(1024); - Ok(Self { - data, - status: Arc::new(RwLock::new(status)), - stdout_tx: broadcast::Sender::new(2048), - stderr_tx: None, - #[cfg(feature = "events")] - events_tx: broadcast::Sender::new(2048), - #[cfg(feature = "events")] - internal_events_tx: internal_tx, - #[cfg(feature = "events")] - internal_events_rx: Some(internal_rx), - stdin_tx, - stdin_rx: Some(stdin_rx), + /// Create a new `InstanceHandle` with a blank `ServerConfig` + pub fn new() -> Self { + Self { + config: Arc::new(RwLock::new(ServerConfig::new())), + status: Arc::new(RwLock::new(InstanceStatus::Stopped)), child: None, shutdown: CancellationToken::new(), - internal_bus_tx: broadcast::Sender::new(2048), + stdout_tx: broadcast::Sender::new(1024), + stderr_tx: broadcast::Sender::new(1024), + } + } + + /// Create a new `InstanceHandle` with a `ServerConfig`, config is consumed + pub fn with_cfg(config: ServerConfig) -> Result { + Ok(Self { + config: Arc::new(RwLock::new(config)), + status: Arc::new(RwLock::new(InstanceStatus::Stopped)), + child: None, + shutdown: CancellationToken::new(), + stdout_tx: broadcast::Sender::new(1024), + stderr_tx: broadcast::Sender::new(1024), }) } - pub async fn send_command>(&self, cmd: S) -> Result<(), ServerError> { - let mut command = cmd.into(); - if !command.ends_with('\n') { - command.push('\n'); + pub async fn start(&mut self) -> Result<(), HandleError> { + if !self.stopped_killed_or_crashed().await { + return Err(HandleError::StartFailedNotStopped); } - self.stdin_tx - .send(command) - .await - .map_err(|_| ServerError::StdinWriteFailed)?; - - Ok(()) - } - - pub async fn start(&mut self) -> Result<(), ServerError> { - self.validate_start_parameters().await?; - self.setup_loopback()?; - - self.transition_status(InstanceStatus::Starting).await; - - let command = self.build_start_command(); - let child = self.spawn_child_process(command)?; - - self.setup_stream_pumps(child)?; - - self.setup_parser()?; - - let mut rx = self.internal_bus_tx.subscribe(); - - loop { - match rx.recv().await { - Ok(event) => { - if event == InternalEvent::ServerStarted { - self.transition_status(InstanceStatus::Running).await; - break; - } - continue; - } - _ => continue, - } - } - - Ok(()) - } - - async fn validate_start_parameters(&self) -> Result<(), ServerError> { if self.child.is_some() { - return Err(ServerError::AlreadyRunning); + return Err(HandleError::StartFailedChildExists); } - Ok(()) - } + _ = self.change_status(InstanceStatus::Starting); - async fn transition_status(&self, status: InstanceStatus) { - let r_guard = self.status.read().await; - let old = r_guard.clone(); - drop(r_guard); + let mut command = self.build_command().await; + let child = command.spawn(); - let new = status.clone(); + self.setup_std_pumps().await?; - let mut guard = self.status.write().await; - *guard = status; - drop(guard); - - let event = InstanceEvent { - id: Uuid::new_v4(), - - timestamp: Utc::now(), - - payload: EventPayload::StateChange { old, new }, - }; - - _ = self.internal_events_tx.send(event).await; - } - - fn build_start_command(&self) -> process::Command { - let mut command = process::Command::new("java"); - command - .arg("-jar") - .arg(&self.data.jar_path) - .arg("nogui") - .current_dir(&self.data.root_dir) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .stdin(Stdio::piped()); - - command.process_group(0); - command - } - - fn spawn_child_process(&self, mut command: process::Command) -> Result { - command.spawn().map_err(|_| ServerError::CommandFailed) - } - - fn setup_stream_pumps(&mut self, mut child: Child) -> Result<(), ServerError> { - let stdout = child.stdout.take().ok_or(ServerError::NoStdoutPipe)?; - let stderr = child.stderr.take().ok_or(ServerError::NoStderrPipe)?; - let stdin = child.stdin.take().ok_or(ServerError::NoStdinPipe)?; - - let child = Arc::new(RwLock::new(child)); - self.child = Some(child); - - let stdout_tx = self.stdout_tx.clone(); - let stderr_tx = broadcast::Sender::new(2048); - self.stderr_tx = Some(stderr_tx.clone()); - let shutdown = self.shutdown.clone(); - - let stdout_status = self.status.clone(); - let stderr_status = self.status.clone(); - let internal_tx1 = self.internal_events_tx.clone(); - let internal_tx2 = self.internal_events_tx.clone(); - - tokio::spawn(async move { - let mut stdout_reader = BufReader::new(stdout).lines(); - loop { - match stdout_reader.next_line().await { - Ok(Some(line)) => { - let _ = stdout_tx.send(InstanceEvent::stdout(line)); - } - _ => { - let status_guard = stdout_status.read().await; - let state = status_guard.clone(); - if state == InstanceStatus::Running && state == InstanceStatus::Starting { - let old = status_guard.clone(); - drop(status_guard); - let mut status = stdout_status.write().await; - *status = InstanceStatus::Crashed; - let event = InstanceEvent { - id: Uuid::new_v4(), - - timestamp: Utc::now(), - - payload: EventPayload::StateChange { - old, - new: status.clone(), - }, - }; - - _ = internal_tx1.send(event).await; - drop(status); - break; - } - drop(status_guard); - } - } - } - }); - - tokio::spawn(async move { - let mut stderr_reader = BufReader::new(stderr).lines(); - loop { - match stderr_reader.next_line().await { - Ok(Some(line)) => { - let _ = stderr_tx.send(InstanceEvent::stderr(line)); - } - _ => { - let status_guard = stderr_status.read().await; - let state = status_guard.clone(); - if state == InstanceStatus::Running && state == InstanceStatus::Starting { - let old = status_guard.clone(); - drop(status_guard); - let mut status = stderr_status.write().await; - *status = InstanceStatus::Crashed; - let event = InstanceEvent { - id: Uuid::new_v4(), - - timestamp: Utc::now(), - - payload: EventPayload::StateChange { - old, - new: status.clone(), - }, - }; - - _ = internal_tx2.send(event).await; - drop(status); - break; - } - drop(status_guard); - } - } - } - }); - - let mut stdin_rx = self.stdin_rx.take().ok_or(ServerError::NoStdinPipe)?; - - tokio::spawn(async move { - let mut writer = BufWriter::new(stdin); - - loop { - tokio::select! { - _ = shutdown.cancelled() => { - break; - } - maybe_cmd = stdin_rx.recv() => { - if let Some(cmd) = maybe_cmd { - _ = writer.write_all(cmd.as_bytes()).await; - _ = writer.flush().await; - } - } - } - } - }); - - Ok(()) - } - - #[cfg(all(feature = "events", any(feature = "mc-vanilla")))] - fn setup_loopback(&mut self) -> Result<(), ServerError> { - let shutdown1 = self.shutdown.clone(); - - let event_tx1 = self.events_tx.clone(); - //internal mpsc to broadcast loopback - if let Some(mut internal_rx) = self.internal_events_rx.take() { - tokio::spawn(async move { - let tx = event_tx1; - loop { - tokio::select! { - _ = shutdown1.cancelled() => { - break; - } - - maybe_event = internal_rx.recv() => { - if let Some(event) = maybe_event { - _ = tx.send(event); - } - } - } - } - }); - } - Ok(()) - } - - #[cfg(all(feature = "events", any(feature = "mc-vanilla")))] - fn setup_parser(&mut self) -> Result<(), ServerError> { - use crate::config::LogMeta; - - let stdout_stream = self - .subscribe(StreamSource::Stdout) - .map_err(|_| ServerError::NoStdoutPipe)?; - let shutdown2 = self.shutdown.clone(); - let bus_tx = self.internal_bus_tx.clone(); - - #[cfg(feature = "mc-vanilla")] - if self.data.mc_type == MinecraftType::Vanilla { - tokio::spawn(async move { - let mut rx = stdout_stream; - let tx = bus_tx; - - loop { - tokio::select! { - _ = shutdown2.cancelled() => { - break; - } - next_line = rx.next() => { - if let Some(Ok(val)) = next_line { - let event_line = match val.payload { - EventPayload::StdLine{line} => { - line - }, - _ => continue, - }; - - let meta = match LogMeta::new(event_line.line) { - Ok(Some(log_meta)) => { - log_meta - }, - _ => continue, - }; - - match meta.parse_event() { - Ok(Some(event)) => _ = tx.send(event), - _ => continue, - } - } - } - } - } - }); - } - Ok(()) - } - - pub async fn kill(&mut self) -> Result<(), ServerError> { - if let Some(child_arc) = self.child.clone() { - self.transition_status(InstanceStatus::Killing).await; - let mut child = child_arc.write().await; - - child.kill().await.map_err(|_| ServerError::CommandFailed)?; - - self.transition_status(InstanceStatus::Killed).await; - sleep(Duration::from_secs(1)).await; - self.shutdown.cancel(); - self.child = None; - Ok(()) + if cfg!(feature = "event") { + // TODO: await server Done (...)! before status::Running for event module + todo!() } else { - Err(ServerError::NotRunning) + _ = self.change_status(InstanceStatus::Running); } + todo!() } - pub async fn stop(&mut self) -> Result<(), ServerError> { - if let Some(child_arc) = self.child.clone() { - self.transition_status(InstanceStatus::Stopping).await; - - _ = self.send_command("stop").await; - let mut child = child_arc.write().await; - child.wait().await.map_err(|_| ServerError::CommandFailed)?; - - self.transition_status(InstanceStatus::Stopped).await; - sleep(Duration::from_secs(1)).await; - self.shutdown.cancel(); - self.child = None; - Ok(()) - } else { - Err(ServerError::NotRunning) + pub async fn stop(&mut self) -> Result<(), HandleError> { + if self.get_status().await != InstanceStatus::Running { + return Err(HandleError::StopFailedNotRunning); } + + let child = self.child.clone().ok_or(HandleError::StopFailedChildNotExists)?; + + _ = self.change_status(InstanceStatus::Stopping); + + let child_w = child.write().await; + + // TODO:: Create send command for graceful stop, finish logic with shutdown token + todo!() } - pub fn subscribe( - &self, - stream: StreamSource, - ) -> Result, SubscribeError> { - match stream { - StreamSource::Stdout => { - let rx = self.stdout_tx.subscribe(); - Ok(BroadcastStream::new(rx)) - } - StreamSource::Stderr => { - let rx = match &self.stderr_tx { - Some(value) => value.subscribe(), - None => return Err(SubscribeError::NoStderr), - }; - Ok(BroadcastStream::new(rx)) - } - #[cfg(feature = "events")] - StreamSource::Event => { - let rx = self.events_tx.subscribe(); - Ok(BroadcastStream::new(rx)) - } - } + pub async fn kill(&mut self) -> Result<(), HandleError> { + let child = self.child.clone().ok_or(HandleError::KillFailedChildNotExists)?; + + _ = self.change_status(InstanceStatus::Killing); + + let mut child_w = child.write().await; + + child_w.kill().await.map_err(|_| HandleError::KillFailledInternal)?; + + // TODO:: Finish kill logic including updating shutdown token status + todo!() } } + +// region: --- Utils + +impl InstanceHandle { + async fn stopped_killed_or_crashed(&self) -> bool { + let status = self.get_status().await; + + if status == InstanceStatus::Stopped + || status == InstanceStatus::Killed + || status == InstanceStatus::Crashed + { + return true; + } + false + } + + async fn get_status(&self) -> InstanceStatus { + let status_r = self.status.read().await; + let res = status_r.clone(); + drop(status_r); + + res + } + + async fn change_status( + &mut self, + new_status: InstanceStatus, + ) -> (InstanceStatus, InstanceStatus) { + let mut status_w = self.status.write().await; + let old = status_w.clone(); + *status_w = new_status.clone(); + drop(status_w); + (old, new_status) + } + + async fn get_config(&self) -> ServerConfig { + let config_r = self.config.read().await; + let res = config_r.clone(); + drop(config_r); + + res + } + + async fn build_command(&self) -> Command { + let cfg = self.get_config().await; + let mut command = Command::new("java"); + + command.arg("-jar").arg(&cfg.jar_path).arg("nogui").current_dir(&cfg.core_path); + + command.stdout(Stdio::piped()).stderr(Stdio::piped()); + + command + } +} + +async fn get_status_arc(arc: Arc>) -> InstanceStatus { + let status_r = arc.read().await; + let res = status_r.clone(); + drop(status_r); + + res +} + +async fn change_status_arc( + arc: Arc>, + new_status: InstanceStatus, +) -> (InstanceStatus, InstanceStatus) { + let mut status_w = arc.write().await; + let old = status_w.clone(); + *status_w = new_status.clone(); + drop(status_w); + (old, new_status) +} + +// endregion: --- Utils + +// region: --- StdStream +impl InstanceHandle { + async fn setup_std_pumps(&mut self) -> Result<(), HandleError> { + let child = self.child.clone().ok_or(HandleError::PumpsFailedNoChild)?; + + let mut child_w = child.write().await; + + let stdout_rx = child_w.stdout.take().ok_or(HandleError::PumpsFailedNoStdout)?; + let stderr_rx = child_w.stderr.take().ok_or(HandleError::PumpsFailedNoStderr)?; + + let stdout_tx = self.stdout_tx.clone(); + let stderr_tx = self.stderr_tx.clone(); + + let status_stdout = self.status.clone(); + let status_stderr = self.status.clone(); + + tokio::spawn(async move { + let mut stdout_br = BufReader::new(stdout_rx).lines(); + loop { + match stdout_br.next_line().await { + Ok(Some(line)) => { + _ = stdout_tx.send(line); + } + _ => { + let status = get_status_arc(status_stdout.clone()).await; + if status == InstanceStatus::Running { + change_status_arc(status_stdout, InstanceStatus::Crashed).await; + } + break; + } + } + } + }); + + tokio::spawn(async move { + let mut stdout_br = BufReader::new(stderr_rx).lines(); + loop { + match stdout_br.next_line().await { + Ok(Some(line)) => { + _ = stderr_tx.send(line); + } + _ => { + let status = get_status_arc(status_stderr.clone()).await; + if status == InstanceStatus::Running { + change_status_arc(status_stderr, InstanceStatus::Crashed).await; + } + break; + } + } + } + }); + + todo!() + } +} +// endregion: --- StdStream diff --git a/src/instance/mod.rs b/src/instance/mod.rs index 113958c..faedae7 100644 --- a/src/instance/mod.rs +++ b/src/instance/mod.rs @@ -1,5 +1,2 @@ -mod handle; -mod types; - -pub use handle::InstanceHandle; -pub use types::{InstanceData, InstanceStatus}; +pub mod handle; +pub mod types; diff --git a/src/instance/types.rs b/src/instance/types.rs index 98bef48..d90f241 100644 --- a/src/instance/types.rs +++ b/src/instance/types.rs @@ -1,15 +1,3 @@ -use std::path::PathBuf; - -use crate::config::{MinecraftType, MinecraftVersion}; - -#[derive(Debug, Clone)] -pub struct InstanceData { - pub root_dir: PathBuf, - pub jar_path: PathBuf, - pub mc_version: MinecraftVersion, - pub mc_type: MinecraftType, -} - #[derive(Debug, Clone, PartialEq, Eq)] pub enum InstanceStatus { Starting, diff --git a/src/lib.rs b/src/lib.rs index 35bbafe..3fd3bb3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,6 @@ -pub mod config; +mod config; +mod instance; +mod server; + +pub use server::*; pub mod error; -pub mod instance; -pub mod manifests; -pub mod parser; -pub mod server; -pub mod utils; diff --git a/src/manifests/mod.rs b/src/manifests/mod.rs deleted file mode 100644 index f0e7b58..0000000 --- a/src/manifests/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod vanilla; diff --git a/src/manifests/vanilla.rs b/src/manifests/vanilla.rs deleted file mode 100644 index 2eb394d..0000000 --- a/src/manifests/vanilla.rs +++ /dev/null @@ -1,114 +0,0 @@ -#![cfg(feature = "mc-vanilla")] - -use async_trait::async_trait; -use reqwest::Client; -use serde::Deserialize; - -use crate::{config::MinecraftVersion, error::ManifestError}; - -#[derive(Debug, Clone, Deserialize)] -pub struct VanillaManifestV2 { - latest: VanillaManifestV2Latest, - versions: Vec, -} - -#[derive(Debug, Clone, Deserialize)] -pub struct VanillaManifestV2Latest { - release: String, - snapshot: String, -} - -#[derive(Debug, Clone, Deserialize)] -pub struct VanillaManifestV2Version { - id: String, - #[serde(rename = "type")] - mc_type: String, - url: String, - time: String, - #[serde(rename = "releaseTime")] - release_time: String, - sha1: String, - #[serde(rename = "complianceLevel")] - compliance_level: u32, -} - -#[derive(Debug, Clone, Deserialize)] -pub struct VanillaReleaseManifest { - downloads: VanillaReleaseManifestDownloads, -} -#[derive(Debug, Clone, Deserialize)] -pub struct VanillaReleaseManifestDownloads { - client: VanillaReleaseManifestDownloadsItem, - client_mappings: VanillaReleaseManifestDownloadsItem, - server: VanillaReleaseManifestDownloadsItem, - server_mappings: VanillaReleaseManifestDownloadsItem, -} - -#[derive(Debug, Clone, Deserialize)] -pub struct VanillaReleaseManifestDownloadsItem { - sha1: String, - size: u32, - url: String, -} - -impl VanillaReleaseManifest { - pub async fn load(version: VanillaManifestV2Version) -> Result { - let client = Client::new(); - - let manifest: VanillaReleaseManifest = client - .get(&version.url) - .send() - .await - .map_err(|_| ManifestError::LoadUrlError)? - .error_for_status() - .map_err(|_| ManifestError::LoadUrlError)? - .json() - .await - .map_err(|e| { - eprintln!("{}", e); - ManifestError::JsonParseError - })?; - - Ok(manifest) - } - - pub fn server_url(&self) -> String { - self.downloads.server.url.clone() - } -} - -impl VanillaManifestV2 { - pub async fn load() -> Result { - let client = Client::new(); - - let manifest: VanillaManifestV2 = client - .get("https://piston-meta.mojang.com/mc/game/version_manifest_v2.json") - .send() - .await - .map_err(|_| ManifestError::LoadUrlError)? - .error_for_status() - .map_err(|_| ManifestError::LoadUrlError)? - .json() - .await - .map_err(|e| { - eprintln!("{}", e); - ManifestError::JsonParseError - })?; - - Ok(manifest) - } - - pub fn find( - &self, - version: MinecraftVersion, - ) -> Result, ManifestError> { - let id = version.to_string(); - - let found = match self.versions.iter().find(|p| p.id == id) { - Some(val) => Some(val.clone()), - None => None, - }; - - Ok(found) - } -} diff --git a/src/parser/mod.rs b/src/parser/mod.rs deleted file mode 100644 index b1f64c6..0000000 --- a/src/parser/mod.rs +++ /dev/null @@ -1,26 +0,0 @@ -use regex::Regex; - -use crate::{ - config::{ - LogMeta, - stream::{EventPayload, InstanceEvent, InternalEvent, LogLevel}, - }, - error::ParserError, -}; - -impl LogMeta { - pub fn parse_event(&self) -> Result, ParserError> { - if self.thread == "Server thread" && self.level == LogLevel::Info { - return self.parse_server_thread_info_lv2(); - } - Ok(None) - } - - fn parse_server_thread_info_lv2(&self) -> Result, ParserError> { - let re = Regex::new(r"Done \([0-9.]+s\)!").unwrap(); - if re.is_match(&self.msg) { - return Ok(Some(InternalEvent::ServerStarted)); - } - Ok(None) - } -} diff --git a/src/server/domain.rs b/src/server/domain.rs deleted file mode 100644 index 3c9c011..0000000 --- a/src/server/domain.rs +++ /dev/null @@ -1,248 +0,0 @@ -use std::{ops::RangeInclusive, path::PathBuf, str::FromStr}; - -use serde::{Deserialize, Serialize}; -use serde_json::json; -use tokio::{ - fs::{File, create_dir, read, read_dir}, - io::{self, AsyncWriteExt}, - sync::{RwLock, watch}, -}; -use tokio_stream::wrappers::BroadcastStream; -use uuid::Uuid; - -use crate::{ - config::{self, MinecraftType, MinecraftVersion, StreamSource, Version, stream::InstanceEvent}, - error::{CreationError, ServerError, SubscribeError}, - instance::InstanceHandle, - manifests::vanilla::{VanillaManifestV2, VanillaManifestV2Version, VanillaReleaseManifest}, - server, -}; - -#[derive(Debug, Clone, Deserialize, Serialize)] -pub struct MineGuardConfig { - uuid: Uuid, - pub server_dir: PathBuf, - pub jar_path: PathBuf, - pub mc_version: MinecraftVersion, - pub mc_type: MinecraftType, -} - -#[derive(Debug)] -pub struct MineGuardServer { - pub handle: RwLock, - pub config: RwLock, -} - -impl MineGuardConfig { - pub fn new() -> Self { - Self { - uuid: Uuid::new_v4(), - server_dir: PathBuf::new(), - jar_path: PathBuf::new(), - mc_version: MinecraftVersion::Release(Version::from_str("0.00.00").unwrap()), - mc_type: MinecraftType::Vanilla, - } - } -} - -impl MineGuardServer { - async fn load_cfg_handle( - config: MineGuardConfig, - handle: InstanceHandle, - ) -> Result { - Ok(Self { - config: RwLock::new(config), - handle: RwLock::new(handle), - }) - } - pub async fn create( - mc_version: MinecraftVersion, - mc_type: MinecraftType, - directory: PathBuf, - ) -> Result { - if !directory.is_dir() { - return Err(CreationError::DirectoryError); - } - - let uuid = Uuid::new_v4(); - - let server_root = directory.join(uuid.to_string()); - let jar_path_rel = - PathBuf::from_str("server.jar").map_err(|_| CreationError::DirectoryError)?; - let jar_path_full = server_root.join(jar_path_rel.clone()); - - create_dir(server_root.clone()) - .await - .map_err(|_| CreationError::DirectoryError)?; - - let internal_dir = server_root.join(".mineguard"); - create_dir(internal_dir) - .await - .map_err(|_| CreationError::DirectoryError)?; - - let mut url = String::new(); - - if mc_type == MinecraftType::Vanilla { - let vanilla_manifest = VanillaManifestV2::load() - .await - .map_err(|_| CreationError::ManifestError)?; - - let find_ver = match vanilla_manifest - .find(mc_version.clone()) - .map_err(|_| CreationError::ManifestError)? - { - Some(val) => val, - None => return Err(CreationError::VersionError), - }; - - let release_manifest = VanillaReleaseManifest::load(find_ver) - .await - .map_err(|_| CreationError::ManifestError)?; - - url = release_manifest.server_url(); - } - - let resp = reqwest::get(url) - .await - .map_err(|_| CreationError::NetworkError)?; - let mut body = resp - .bytes() - .await - .map_err(|_| CreationError::NetworkError)?; - let mut out = File::create(jar_path_full) - .await - .map_err(|_| CreationError::DirectoryError)?; - out.write_all_buf(&mut body) - .await - .map_err(|_| CreationError::DirectoryError)?; - - let config = MineGuardConfig { - uuid: uuid, - server_dir: server_root, - jar_path: jar_path_rel, - mc_version: mc_version, - mc_type: mc_type, - }; - - let handle = InstanceHandle::new_with_params( - config.server_dir.clone(), - config.jar_path.clone(), - config.mc_version.clone(), - config.mc_type.clone(), - ) - .map_err(|_| CreationError::CreationError)?; - - let server = MineGuardServer { - config: RwLock::new(config), - handle: RwLock::new(handle), - }; - - Ok(server) - } - - pub async fn start(&self) -> Result<(), ServerError> { - let mut handle_w = self.handle.write().await; - let res = handle_w.start().await; - res - } - - pub async fn kill(&self) -> Result<(), ServerError> { - let mut handle_w = self.handle.write().await; - let res = handle_w.kill().await; - res - } - pub async fn stop(&self) -> Result<(), ServerError> { - let mut handle_w = self.handle.write().await; - let res = handle_w.stop().await; - res - } - - pub async fn subscribe( - &self, - stream: StreamSource, - ) -> Result, SubscribeError> { - let handle_r = self.handle.read().await; - let res = handle_r.subscribe(stream); - res - } - - pub async fn accept_eula(&self) -> Result<(), ServerError> { - let config_r = self.config.read().await; - let eula_path = config_r.server_dir.join("eula.txt"); - - let mut out = File::create(eula_path) - .await - .map_err(|_| ServerError::NoEULA)?; - - out.write_all(b"#Generated by MineGuard\neula=true\n") - .await - .map_err(|_| ServerError::WriteEULAFailed)?; - - Ok(()) - } - - pub async fn write_config(&self) -> Result<(), ServerError> { - let config_r = self.config.read().await; - let root_path = config_r.server_dir.clone(); - let config_clone = config_r.clone(); - drop(config_r); - - let config_path = root_path.join(".mineguard/config.json"); - - let json = serde_json::to_vec_pretty(&config_clone).map_err(|_| ServerError::FileIO)?; - - File::create(config_path) - .await - .map_err(|_| ServerError::FileIO)? - .write_all(&json) - .await - .map_err(|_| ServerError::FileIO)?; - - Ok(()) - } - - pub async fn load(path: &PathBuf) -> Result { - let config_path = path.join(".mineguard/config.json"); - - let data = read(config_path) - .await - .map_err(|_| CreationError::DirectoryError)?; - - let config: MineGuardConfig = - serde_json::from_slice(&data).map_err(|_| CreationError::CreationError)?; - let handle = InstanceHandle::new_with_config(config.clone()) - .map_err(|_| CreationError::CreationError)?; - - MineGuardServer::load_cfg_handle(config, handle).await - } - - pub async fn load_all(path: PathBuf) -> Result, CreationError> { - let mut dirs = Vec::new(); - let mut entries = read_dir(path) - .await - .map_err(|_| CreationError::DirectoryError)?; - - while let Some(entry) = entries - .next_entry() - .await - .map_err(|_| CreationError::DirectoryError)? - { - let meta = entry - .metadata() - .await - .map_err(|_| CreationError::DirectoryError)?; - if meta.is_dir() { - dirs.push(entry.path()); - } - } - - let mut servers: Vec = Vec::new(); - - for v in dirs { - println!("{}", v.to_str().unwrap()); - servers.push(Self::load(&v).await?); - } - - Ok(servers) - } -} diff --git a/src/server/mod.rs b/src/server/mod.rs index d7abca1..830448f 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1 +1,15 @@ -pub mod domain; +use tokio::sync::RwLock; + +use crate::instance::handle::InstanceHandle; + +#[derive(Debug)] +pub struct MineGuardServer { + handle: RwLock, +} + +impl MineGuardServer { + pub fn create() -> Self { + let new_instance = InstanceHandle::new(); + Self { handle: RwLock::new(new_instance) } + } +} diff --git a/src/utils.rs b/src/utils.rs deleted file mode 100644 index 1ba477b..0000000 --- a/src/utils.rs +++ /dev/null @@ -1,24 +0,0 @@ -use chrono::{DateTime, Datelike, Local, NaiveTime, TimeZone, Timelike, Utc}; -use regex::Regex; - -pub fn extract_timestamp(input: &str) -> Option> { - let re = Regex::new(r"\[(.*?)\]").unwrap(); - let time_s = re.captures(input).map(|v| v[1].to_string()); - time_s.as_ref()?; - let time = NaiveTime::parse_from_str(&time_s.unwrap(), "%H:%M:%S").ok()?; - - let today = Local::now().date_naive(); - - let local_dt = Local - .with_ymd_and_hms( - today.year(), - today.month(), - today.day(), - time.hour(), - time.minute(), - time.second(), - ) - .single()?; - - Some(local_dt.with_timezone(&Utc)) -}