diff --git a/Cargo.lock b/Cargo.lock
index f219eb8..b8367a4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,18 +4,18 @@ version = 4
[[package]]
name = "addr2line"
-version = "0.24.2"
+version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
+checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b"
dependencies = [
"gimli",
]
[[package]]
name = "adler2"
-version = "2.0.0"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "aho-corasick"
@@ -26,12 +26,6 @@ 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"
@@ -43,9 +37,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.97"
+version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f"
+checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]]
name = "anymap2"
@@ -67,19 +61,25 @@ dependencies = [
]
[[package]]
-name = "autocfg"
-version = "1.4.0"
+name = "atomic-waker"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+
+[[package]]
+name = "autocfg"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "axum"
-version = "0.8.3"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288"
+checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871"
dependencies = [
"axum-core",
- "base64 0.22.1",
+ "base64",
"bytes",
"form_urlencoded",
"futures-util",
@@ -94,8 +94,7 @@ dependencies = [
"mime",
"percent-encoding",
"pin-project-lite",
- "rustversion",
- "serde",
+ "serde_core",
"serde_json",
"serde_path_to_error",
"serde_urlencoded",
@@ -111,9 +110,9 @@ dependencies = [
[[package]]
name = "axum-core"
-version = "0.5.2"
+version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6"
+checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22"
dependencies = [
"bytes",
"futures-core",
@@ -122,7 +121,6 @@ dependencies = [
"http-body-util",
"mime",
"pin-project-lite",
- "rustversion",
"sync_wrapper",
"tower-layer",
"tower-service",
@@ -131,9 +129,9 @@ dependencies = [
[[package]]
name = "axum-extra"
-version = "0.10.1"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45bf463831f5131b7d3c756525b305d40f1185b688565648a92e1392ca35713d"
+checksum = "9963ff19f40c6102c76756ef0a46004c0d58957d87259fc9208ff8441c12ab96"
dependencies = [
"axum",
"axum-core",
@@ -146,17 +144,17 @@ dependencies = [
"mime",
"pin-project-lite",
"rustversion",
- "serde",
- "tower",
+ "serde_core",
"tower-layer",
"tower-service",
+ "tracing",
]
[[package]]
name = "backtrace"
-version = "0.3.74"
+version = "0.3.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
+checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6"
dependencies = [
"addr2line",
"cfg-if",
@@ -164,15 +162,9 @@ dependencies = [
"miniz_oxide",
"object",
"rustc-demangle",
- "windows-targets 0.52.6",
+ "windows-link",
]
-[[package]]
-name = "base64"
-version = "0.21.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
-
[[package]]
name = "base64"
version = "0.22.1"
@@ -190,9 +182,9 @@ dependencies = [
[[package]]
name = "bitflags"
-version = "2.9.0"
+version = "2.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
+checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394"
[[package]]
name = "block-buffer"
@@ -211,9 +203,9 @@ checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9"
[[package]]
name = "bumpalo"
-version = "3.17.0"
+version = "3.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
[[package]]
name = "bytes"
@@ -223,31 +215,31 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
[[package]]
name = "cc"
-version = "1.2.17"
+version = "1.2.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a"
+checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f"
dependencies = [
+ "find-msvc-tools",
"shlex",
]
[[package]]
name = "cfg-if"
-version = "1.0.0"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
[[package]]
name = "chrono"
-version = "0.4.40"
+version = "0.4.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c"
+checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2"
dependencies = [
- "android-tzdata",
"iana-time-zone",
"js-sys",
"num-traits",
"wasm-bindgen",
- "windows-link 0.1.1",
+ "windows-link",
]
[[package]]
@@ -283,7 +275,7 @@ version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e"
dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -357,7 +349,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -368,14 +360,14 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
name = "data-encoding"
-version = "2.8.0"
+version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010"
+checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
[[package]]
name = "derive_builder"
@@ -395,7 +387,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -405,7 +397,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
dependencies = [
"derive_builder_core",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -441,7 +433,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -472,6 +464,12 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959"
+
[[package]]
name = "fnv"
version = "1.0.7"
@@ -480,9 +478,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "form_urlencoded"
-version = "1.2.1"
+version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
dependencies = [
"percent-encoding",
]
@@ -543,7 +541,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -588,36 +586,36 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.15"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [
"cfg-if",
"js-sys",
"libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi 0.11.1+wasi-snapshot-preview1",
"wasm-bindgen",
]
[[package]]
name = "getrandom"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0"
+checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"r-efi",
- "wasi 0.14.2+wasi-0.2.4",
+ "wasi 0.14.7+wasi-0.2.4",
"wasm-bindgen",
]
[[package]]
name = "gimli"
-version = "0.31.1"
+version = "0.32.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
+checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7"
[[package]]
name = "gloo"
@@ -789,7 +787,7 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "903f432be5ba34427eac5e16048ef65604a82061fe93789f2212afc73d8617d6"
dependencies = [
- "getrandom 0.2.15",
+ "getrandom 0.2.16",
"gloo-events 0.2.0",
"gloo-utils 0.2.0",
"serde",
@@ -1025,7 +1023,7 @@ dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -1040,17 +1038,17 @@ dependencies = [
[[package]]
name = "hashbrown"
-version = "0.15.2"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
[[package]]
name = "headers"
-version = "0.4.0"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9"
+checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb"
dependencies = [
- "base64 0.21.7",
+ "base64",
"bytes",
"headers-core",
"http 1.3.1",
@@ -1068,12 +1066,6 @@ dependencies = [
"http 1.3.1",
]
-[[package]]
-name = "hermit-abi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
-
[[package]]
name = "hermit-abi"
version = "0.5.2"
@@ -1145,31 +1137,33 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424"
[[package]]
name = "hyper"
-version = "1.6.0"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
+checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e"
dependencies = [
+ "atomic-waker",
"bytes",
"futures-channel",
- "futures-util",
+ "futures-core",
"http 1.3.1",
"http-body",
"httparse",
"httpdate",
"itoa",
"pin-project-lite",
+ "pin-utils",
"smallvec",
"tokio",
]
[[package]]
name = "hyper-util"
-version = "0.1.11"
+version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2"
+checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8"
dependencies = [
"bytes",
- "futures-util",
+ "futures-core",
"http 1.3.1",
"http-body",
"hyper",
@@ -1180,9 +1174,9 @@ dependencies = [
[[package]]
name = "iana-time-zone"
-version = "0.1.63"
+version = "0.1.64"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
+checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb"
dependencies = [
"android_system_properties",
"core-foundation-sys",
@@ -1204,21 +1198,22 @@ dependencies = [
[[package]]
name = "icu_collections"
-version = "1.5.0"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
+checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
dependencies = [
"displaydoc",
+ "potential_utf",
"yoke",
"zerofrom",
"zerovec",
]
[[package]]
-name = "icu_locid"
-version = "1.5.0"
+name = "icu_locale_core"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
+checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
dependencies = [
"displaydoc",
"litemap",
@@ -1227,31 +1222,11 @@ dependencies = [
"zerovec",
]
-[[package]]
-name = "icu_locid_transform"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
-dependencies = [
- "displaydoc",
- "icu_locid",
- "icu_locid_transform_data",
- "icu_provider",
- "tinystr",
- "zerovec",
-]
-
-[[package]]
-name = "icu_locid_transform_data"
-version = "1.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d"
-
[[package]]
name = "icu_normalizer"
-version = "1.5.0"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
+checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
dependencies = [
"displaydoc",
"icu_collections",
@@ -1259,67 +1234,54 @@ dependencies = [
"icu_properties",
"icu_provider",
"smallvec",
- "utf16_iter",
- "utf8_iter",
- "write16",
"zerovec",
]
[[package]]
name = "icu_normalizer_data"
-version = "1.5.1"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7"
+checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
[[package]]
name = "icu_properties"
-version = "1.5.1"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
+checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
dependencies = [
"displaydoc",
"icu_collections",
- "icu_locid_transform",
+ "icu_locale_core",
"icu_properties_data",
"icu_provider",
- "tinystr",
+ "potential_utf",
+ "zerotrie",
"zerovec",
]
[[package]]
name = "icu_properties_data"
-version = "1.5.1"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2"
+checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
[[package]]
name = "icu_provider"
-version = "1.5.0"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
+checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
dependencies = [
"displaydoc",
- "icu_locid",
- "icu_provider_macros",
+ "icu_locale_core",
"stable_deref_trait",
"tinystr",
"writeable",
"yoke",
"zerofrom",
+ "zerotrie",
"zerovec",
]
-[[package]]
-name = "icu_provider_macros"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.100",
-]
-
[[package]]
name = "ident_case"
version = "1.0.1"
@@ -1328,9 +1290,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "idna"
-version = "1.0.3"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
dependencies = [
"idna_adapter",
"smallvec",
@@ -1339,9 +1301,9 @@ dependencies = [
[[package]]
name = "idna_adapter"
-version = "1.2.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
+checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
dependencies = [
"icu_normalizer",
"icu_properties",
@@ -1364,14 +1326,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "699c1b6d335e63d0ba5c1e1c7f647371ce989c3bcbe1f7ed2b85fa56e3bd1a21"
dependencies = [
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
name = "indexmap"
-version = "2.8.0"
+version = "2.11.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058"
+checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
dependencies = [
"equivalent",
"hashbrown",
@@ -1389,15 +1351,26 @@ dependencies = [
"web-sys",
]
+[[package]]
+name = "io-uring"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b"
+dependencies = [
+ "bitflags",
+ "cfg-if",
+ "libc",
+]
+
[[package]]
name = "is-terminal"
version = "0.4.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
dependencies = [
- "hermit-abi 0.5.2",
+ "hermit-abi",
"libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -1418,21 +1391,21 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.171"
+version = "0.2.176"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
+checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174"
[[package]]
name = "litemap"
-version = "0.7.5"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856"
+checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
[[package]]
name = "lock_api"
-version = "0.4.12"
+version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
@@ -1440,9 +1413,9 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.27"
+version = "0.4.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
[[package]]
name = "matchit"
@@ -1452,9 +1425,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
[[package]]
name = "memchr"
-version = "2.7.4"
+version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
[[package]]
name = "mime"
@@ -1474,22 +1447,22 @@ dependencies = [
[[package]]
name = "miniz_oxide"
-version = "0.8.7"
+version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff70ce3e48ae43fa075863cef62e8b43b71a4f2382229920e0df362592919430"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
dependencies = [
"adler2",
]
[[package]]
name = "mio"
-version = "1.0.3"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
+checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
dependencies = [
"libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys 0.52.0",
+ "wasi 0.11.1+wasi-snapshot-preview1",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -1509,19 +1482,19 @@ dependencies = [
[[package]]
name = "num_cpus"
-version = "1.16.0"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
dependencies = [
- "hermit-abi 0.3.9",
+ "hermit-abi",
"libc",
]
[[package]]
name = "object"
-version = "0.36.7"
+version = "0.37.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
+checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe"
dependencies = [
"memchr",
]
@@ -1534,9 +1507,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "parking_lot"
-version = "0.12.3"
+version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
+checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -1544,22 +1517,22 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.10"
+version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
+checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
- "windows-targets 0.52.6",
+ "windows-targets",
]
[[package]]
name = "percent-encoding"
-version = "2.3.1"
+version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "pin-project"
@@ -1578,7 +1551,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -1604,6 +1577,15 @@ dependencies = [
"thiserror 1.0.69",
]
+[[package]]
+name = "potential_utf"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a"
+dependencies = [
+ "zerovec",
+]
+
[[package]]
name = "ppv-lite86"
version = "0.2.21"
@@ -1635,12 +1617,12 @@ dependencies = [
[[package]]
name = "prettyplease"
-version = "0.2.31"
+version = "0.2.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb"
+checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [
"proc-macro2",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -1679,9 +1661,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.94"
+version = "1.0.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
+checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
dependencies = [
"unicode-ident",
]
@@ -1705,9 +1687,9 @@ dependencies = [
[[package]]
name = "quick-xml"
-version = "0.37.4"
+version = "0.37.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4ce8c88de324ff838700f36fb6ab86c96df0e3c4ab6ef3a9b2044465cce1369"
+checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb"
dependencies = [
"encoding_rs",
"memchr",
@@ -1715,28 +1697,27 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.40"
+version = "1.0.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1"
dependencies = [
"proc-macro2",
]
[[package]]
name = "r-efi"
-version = "5.2.0"
+version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
-version = "0.9.0"
+version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
+checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha",
"rand_core",
- "zerocopy",
]
[[package]]
@@ -1755,23 +1736,23 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
dependencies = [
- "getrandom 0.3.2",
+ "getrandom 0.3.3",
]
[[package]]
name = "redox_syscall"
-version = "0.5.10"
+version = "0.5.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1"
+checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
dependencies = [
"bitflags",
]
[[package]]
name = "regex"
-version = "1.11.1"
+version = "1.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
+checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c"
dependencies = [
"aho-corasick",
"memchr",
@@ -1781,9 +1762,9 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.4.9"
+version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
+checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad"
dependencies = [
"aho-corasick",
"memchr",
@@ -1792,9 +1773,9 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.8.5"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
+checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
[[package]]
name = "route-recognizer"
@@ -1804,15 +1785,15 @@ checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746"
[[package]]
name = "rustc-demangle"
-version = "0.1.24"
+version = "0.1.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
[[package]]
name = "rustversion"
-version = "1.0.20"
+version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "ryu"
@@ -1828,10 +1809,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "serde"
-version = "1.0.219"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
+ "serde_core",
"serde_derive",
]
@@ -1858,36 +1840,47 @@ dependencies = [
]
[[package]]
-name = "serde_derive"
-version = "1.0.219"
+name = "serde_core"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
name = "serde_json"
-version = "1.0.140"
+version = "1.0.145"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
+checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
dependencies = [
"itoa",
"memchr",
"ryu",
"serde",
+ "serde_core",
]
[[package]]
name = "serde_path_to_error"
-version = "0.1.17"
+version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a"
+checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457"
dependencies = [
"itoa",
"serde",
+ "serde_core",
]
[[package]]
@@ -1921,36 +1914,33 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook-registry"
-version = "1.4.2"
+version = "1.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
+checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
dependencies = [
"libc",
]
[[package]]
name = "slab"
-version = "0.4.9"
+version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
+checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
[[package]]
name = "smallvec"
-version = "1.14.0"
+version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "socket2"
-version = "0.5.9"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef"
+checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
dependencies = [
"libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -1977,9 +1967,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.100"
+version = "2.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
+checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
dependencies = [
"proc-macro2",
"quote",
@@ -1994,13 +1984,13 @@ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
[[package]]
name = "synstructure"
-version = "0.13.1"
+version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -2023,11 +2013,11 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "2.0.12"
+version = "2.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
+checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
dependencies = [
- "thiserror-impl 2.0.12",
+ "thiserror-impl 2.0.17",
]
[[package]]
@@ -2038,25 +2028,25 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
name = "thiserror-impl"
-version = "2.0.12"
+version = "2.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
+checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
name = "tinystr"
-version = "0.7.6"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
+checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
dependencies = [
"displaydoc",
"zerovec",
@@ -2064,20 +2054,22 @@ dependencies = [
[[package]]
name = "tokio"
-version = "1.44.1"
+version = "1.47.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a"
+checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
dependencies = [
"backtrace",
"bytes",
+ "io-uring",
"libc",
"mio",
"parking_lot",
"pin-project-lite",
"signal-hook-registry",
+ "slab",
"socket2",
"tokio-macros",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -2088,7 +2080,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -2104,9 +2096,9 @@ dependencies = [
[[package]]
name = "tokio-tungstenite"
-version = "0.26.2"
+version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084"
+checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857"
dependencies = [
"futures-util",
"log",
@@ -2116,9 +2108,9 @@ dependencies = [
[[package]]
name = "toml_datetime"
-version = "0.6.8"
+version = "0.6.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
+checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
[[package]]
name = "toml_edit"
@@ -2173,29 +2165,29 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.28"
+version = "0.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
+checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
name = "tracing-core"
-version = "0.1.33"
+version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
+checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
dependencies = [
"once_cell",
]
[[package]]
name = "tungstenite"
-version = "0.26.2"
+version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13"
+checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442"
dependencies = [
"bytes",
"data-encoding",
@@ -2204,21 +2196,21 @@ dependencies = [
"log",
"rand",
"sha1",
- "thiserror 2.0.12",
+ "thiserror 2.0.17",
"utf-8",
]
[[package]]
name = "typenum"
-version = "1.18.0"
+version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
+checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
[[package]]
name = "unicode-ident"
-version = "1.0.18"
+version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
+checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d"
[[package]]
name = "unicode-segmentation"
@@ -2228,13 +2220,14 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
[[package]]
name = "url"
-version = "2.5.4"
+version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
+checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
+ "serde",
]
[[package]]
@@ -2249,12 +2242,6 @@ version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
-[[package]]
-name = "utf16_iter"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
-
[[package]]
name = "utf8_iter"
version = "1.0.4"
@@ -2263,11 +2250,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
-version = "1.17.0"
+version = "1.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
+checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2"
dependencies = [
- "getrandom 0.3.2",
+ "getrandom 0.3.3",
"js-sys",
"serde",
"wasm-bindgen",
@@ -2281,17 +2268,26 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
+version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "wasi"
-version = "0.14.2+wasi-0.2.4"
+version = "0.14.7+wasi-0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
+checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c"
dependencies = [
- "wit-bindgen-rt",
+ "wasip2",
+]
+
+[[package]]
+name = "wasip2"
+version = "1.0.1+wasi-0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
+dependencies = [
+ "wit-bindgen",
]
[[package]]
@@ -2316,7 +2312,7 @@ dependencies = [
"log",
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
"wasm-bindgen-shared",
]
@@ -2351,7 +2347,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -2394,7 +2390,7 @@ dependencies = [
"ciborium",
"convert_case",
"futures",
- "getrandom 0.3.2",
+ "getrandom 0.3.3",
"gloo 0.11.0",
"instant",
"log",
@@ -2402,8 +2398,9 @@ dependencies = [
"rand",
"serde",
"serde_json",
- "thiserror 2.0.12",
+ "thiserror 2.0.17",
"uuid",
+ "wasm-bindgen",
"wasm-bindgen-futures",
"wasm-logger",
"web-sys",
@@ -2420,7 +2417,7 @@ dependencies = [
"convert_case",
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -2434,7 +2431,7 @@ dependencies = [
"rand",
"serde",
"serde_json",
- "thiserror 2.0.12",
+ "thiserror 2.0.17",
"uuid",
"werewolves-macros",
]
@@ -2457,7 +2454,7 @@ dependencies = [
"rand",
"serde",
"serde_json",
- "thiserror 2.0.12",
+ "thiserror 2.0.17",
"tokio",
"werewolves-macros",
"werewolves-proto",
@@ -2469,50 +2466,44 @@ version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [
- "windows-sys 0.60.2",
+ "windows-sys 0.61.1",
]
[[package]]
name = "windows-core"
-version = "0.61.0"
+version = "0.62.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980"
+checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9"
dependencies = [
"windows-implement",
"windows-interface",
- "windows-link 0.1.1",
+ "windows-link",
"windows-result",
"windows-strings",
]
[[package]]
name = "windows-implement"
-version = "0.60.0"
+version = "0.60.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
+checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
name = "windows-interface"
-version = "0.59.1"
+version = "0.59.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
+checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
-[[package]]
-name = "windows-link"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
-
[[package]]
name = "windows-link"
version = "0.2.0"
@@ -2521,38 +2512,38 @@ checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65"
[[package]]
name = "windows-result"
-version = "0.3.2"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252"
+checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f"
dependencies = [
- "windows-link 0.1.1",
+ "windows-link",
]
[[package]]
name = "windows-strings"
-version = "0.4.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97"
+checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda"
dependencies = [
- "windows-link 0.1.1",
+ "windows-link",
]
[[package]]
name = "windows-sys"
-version = "0.52.0"
+version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
- "windows-targets 0.52.6",
+ "windows-targets",
]
[[package]]
name = "windows-sys"
-version = "0.60.2"
+version = "0.61.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f"
dependencies = [
- "windows-targets 0.53.4",
+ "windows-link",
]
[[package]]
@@ -2561,31 +2552,14 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
- "windows_aarch64_gnullvm 0.52.6",
- "windows_aarch64_msvc 0.52.6",
- "windows_i686_gnu 0.52.6",
- "windows_i686_gnullvm 0.52.6",
- "windows_i686_msvc 0.52.6",
- "windows_x86_64_gnu 0.52.6",
- "windows_x86_64_gnullvm 0.52.6",
- "windows_x86_64_msvc 0.52.6",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.53.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b"
-dependencies = [
- "windows-link 0.2.0",
- "windows_aarch64_gnullvm 0.53.0",
- "windows_aarch64_msvc 0.53.0",
- "windows_i686_gnu 0.53.0",
- "windows_i686_gnullvm 0.53.0",
- "windows_i686_msvc 0.53.0",
- "windows_x86_64_gnu 0.53.0",
- "windows_x86_64_gnullvm 0.53.0",
- "windows_x86_64_msvc 0.53.0",
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
]
[[package]]
@@ -2594,96 +2568,48 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
-
[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
-
[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
-
[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
-
[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
-
[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
-
[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
-
[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
-
[[package]]
name = "winnow"
version = "0.5.40"
@@ -2694,25 +2620,16 @@ dependencies = [
]
[[package]]
-name = "wit-bindgen-rt"
-version = "0.39.0"
+name = "wit-bindgen"
+version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "write16"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
+checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
[[package]]
name = "writeable"
-version = "0.5.5"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
+checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
[[package]]
name = "yansi"
@@ -2757,7 +2674,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -2787,14 +2704,14 @@ checksum = "42bfd190a07ca8cfde7cd4c52b3ac463803dc07323db8c34daa697e86365978c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
name = "yoke"
-version = "0.7.5"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
+checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
dependencies = [
"serde",
"stable_deref_trait",
@@ -2804,34 +2721,34 @@ dependencies = [
[[package]]
name = "yoke-derive"
-version = "0.7.5"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
+checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
"synstructure",
]
[[package]]
name = "zerocopy"
-version = "0.8.24"
+version = "0.8.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879"
+checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.8.24"
+version = "0.8.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be"
+checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
[[package]]
@@ -2851,15 +2768,26 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
"synstructure",
]
[[package]]
-name = "zerovec"
-version = "0.10.4"
+name = "zerotrie"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
+checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
+dependencies = [
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
dependencies = [
"yoke",
"zerofrom",
@@ -2868,11 +2796,11 @@ dependencies = [
[[package]]
name = "zerovec-derive"
-version = "0.10.3"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
+checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.100",
+ "syn 2.0.106",
]
diff --git a/werewolves-proto/Cargo.toml b/werewolves-proto/Cargo.toml
index b339c11..7984809 100644
--- a/werewolves-proto/Cargo.toml
+++ b/werewolves-proto/Cargo.toml
@@ -12,7 +12,6 @@ uuid = { version = "1.17", features = ["v4", "serde"] }
rand = { version = "0.9" }
werewolves-macros = { path = "../werewolves-macros" }
-
[dev-dependencies]
pretty_assertions = { version = "1" }
pretty_env_logger = { version = "0.5" }
diff --git a/werewolves-proto/src/error.rs b/werewolves-proto/src/error.rs
index 813bb25..4e51fa1 100644
--- a/werewolves-proto/src/error.rs
+++ b/werewolves-proto/src/error.rs
@@ -13,8 +13,6 @@ pub enum GameError {
InvalidMessageForGameState,
#[error("no executions during night time")]
NoExecutionsAtNight,
- #[error("no-trial not allowed")]
- NoTrialNotAllowed,
#[error("chracter is already dead")]
CharacterAlreadyDead,
#[error("no matching character found")]
@@ -47,8 +45,6 @@ pub enum GameError {
CantAddVillagerToSettings,
#[error("no mentor for an apprentice to be an apprentice to :(")]
NoApprenticeMentor,
- #[error("BUG: cannot find character in village, but they should be there")]
- CannotFindTargetButShouldBeThere,
#[error("inactive game object")]
InactiveGameObject,
#[error("socket error: {0}")]
@@ -73,4 +69,6 @@ pub enum GameError {
NoPreviousState,
#[error("invalid original kill for guardian guard")]
GuardianInvalidOriginalKill,
+ #[error("player not assigned number: {0}")]
+ PlayerNotAssignedNumber(String),
}
diff --git a/werewolves-proto/src/game/mod.rs b/werewolves-proto/src/game/mod.rs
index dba5239..60fd4b2 100644
--- a/werewolves-proto/src/game/mod.rs
+++ b/werewolves-proto/src/game/mod.rs
@@ -94,8 +94,7 @@ impl Game {
.into_iter()
.map(|c| CharacterState {
player_id: c.player_id().clone(),
- character_id: c.character_id().clone(),
- public_identity: c.public_identity().clone(),
+ identity: c.identity(),
role: c.role().title(),
died_to: c.died_to().cloned(),
})
@@ -109,9 +108,7 @@ impl Game {
(GameState::Night { night }, HostGameMessage::GetState) => {
if let Some(res) = night.current_result() {
return Ok(ServerToHostMessage::ActionResult(
- night
- .current_character()
- .map(|c| c.public_identity().clone()),
+ night.current_character().map(|c| c.identity()),
res.clone(),
));
}
@@ -138,9 +135,7 @@ impl Game {
HostGameMessage::Night(HostNightMessage::ActionResponse(resp)),
) => match night.received_response(resp.clone()) {
Ok(res) => Ok(ServerToHostMessage::ActionResult(
- night
- .current_character()
- .map(|c| c.public_identity().clone()),
+ night.current_character().map(|c| c.identity()),
res,
)),
Err(GameError::NightNeedsNext) => match night.next() {
diff --git a/werewolves-proto/src/game/night.rs b/werewolves-proto/src/game/night.rs
index c2d8582..064ef1c 100644
--- a/werewolves-proto/src/game/night.rs
+++ b/werewolves-proto/src/game/night.rs
@@ -111,7 +111,7 @@ impl Night {
wolves: village
.living_wolf_pack_players()
.into_iter()
- .map(|w| (w.target(), w.role().title()))
+ .map(|w| (w.identity(), w.role().title()))
.collect(),
});
}
@@ -324,7 +324,7 @@ impl Night {
.village
.character_by_id(&kill_target)
.ok_or(GameError::NoMatchingCharacterFound)?
- .character_identity(),
+ .identity(),
});
}
// Remove any further shapeshift prompts from the queue
diff --git a/werewolves-proto/src/game/village.rs b/werewolves-proto/src/game/village.rs
index b8f410f..0c0f748 100644
--- a/werewolves-proto/src/game/village.rs
+++ b/werewolves-proto/src/game/village.rs
@@ -7,14 +7,14 @@ use super::Result;
use crate::{
error::GameError,
game::{DateTime, GameOver, GameSettings},
- message::{Identification, Target},
+ message::{CharacterIdentity, Identification},
player::{Character, CharacterId, PlayerId},
role::{Role, RoleTitle},
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Village {
- characters: Vec,
+ characters: Box<[Character]>,
date_time: DateTime,
}
@@ -58,8 +58,12 @@ impl Village {
.iter()
.cloned()
.zip(roles)
- .map(|(player, role)| Character::new(player, role))
- .collect(),
+ .map(|(player, role)| {
+ let player_str = player.public.to_string();
+ Character::new(player, role)
+ .ok_or_else(|| GameError::PlayerNotAssignedNumber(player_str))
+ })
+ .collect::>>()?,
date_time: DateTime::Night { number: 0 },
})
}
@@ -118,17 +122,11 @@ impl Village {
DateTime::Night { number: _ } => return Err(GameError::NoExecutionsAtNight),
};
- if characters.is_empty() {
- return Err(GameError::NoTrialNotAllowed);
- }
let targets = self
.characters
.iter_mut()
.filter(|c| characters.contains(c.character_id()))
.collect::>();
- if targets.len() != characters.len() {
- return Err(GameError::CannotFindTargetButShouldBeThere);
- }
for t in targets {
t.execute(day)?;
}
@@ -166,39 +164,39 @@ impl Village {
}
}
- pub fn living_players(&self) -> Box<[Target]> {
+ pub fn living_players(&self) -> Box<[CharacterIdentity]> {
self.characters
.iter()
.filter(|c| c.alive())
- .map(Character::target)
+ .map(Character::identity)
.collect()
}
- pub fn target_by_id(&self, character_id: &CharacterId) -> Option {
- self.character_by_id(character_id).map(Character::target)
+ pub fn target_by_id(&self, character_id: &CharacterId) -> Option {
+ self.character_by_id(character_id).map(Character::identity)
}
- pub fn living_villagers(&self) -> Box<[Target]> {
+ pub fn living_villagers(&self) -> Box<[CharacterIdentity]> {
self.characters
.iter()
.filter(|c| c.alive() && c.is_village())
- .map(Character::target)
+ .map(Character::identity)
.collect()
}
- pub fn living_players_excluding(&self, exclude: &CharacterId) -> Box<[Target]> {
+ pub fn living_players_excluding(&self, exclude: &CharacterId) -> Box<[CharacterIdentity]> {
self.characters
.iter()
.filter(|c| c.alive() && c.character_id() != exclude)
- .map(Character::target)
+ .map(Character::identity)
.collect()
}
- pub fn dead_targets(&self) -> Box<[Target]> {
+ pub fn dead_targets(&self) -> Box<[CharacterIdentity]> {
self.characters
.iter()
.filter(|c| !c.alive())
- .map(Character::target)
+ .map(Character::identity)
.collect()
}
diff --git a/werewolves-proto/src/game_test/mod.rs b/werewolves-proto/src/game_test/mod.rs
index 5c4f444..66d2d18 100644
--- a/werewolves-proto/src/game_test/mod.rs
+++ b/werewolves-proto/src/game_test/mod.rs
@@ -156,7 +156,7 @@ fn gen_players(range: Range) -> Box<[Identification]> {
public: PublicIdentity {
name: format!("player {num}"),
pronouns: None,
- number: NonZeroU8::new(num).unwrap(),
+ number: NonZeroU8::new(num),
},
})
.collect()
diff --git a/werewolves-proto/src/game_test/night_order.rs b/werewolves-proto/src/game_test/night_order.rs
index 12bb058..ed7888f 100644
--- a/werewolves-proto/src/game_test/night_order.rs
+++ b/werewolves-proto/src/game_test/night_order.rs
@@ -4,7 +4,7 @@ use pretty_assertions::{assert_eq, assert_ne, assert_str_eq};
use crate::{
message::{
- CharacterIdentity, PublicIdentity,
+ CharacterIdentity,
night::{ActionPrompt, ActionPromptTitle},
},
player::CharacterId,
@@ -13,11 +13,9 @@ use crate::{
fn character_identity() -> CharacterIdentity {
CharacterIdentity {
character_id: CharacterId::new(),
- public: PublicIdentity {
- name: String::new(),
- pronouns: None,
- number: NonZeroU8::new(1).unwrap(),
- },
+ name: Default::default(),
+ pronouns: Default::default(),
+ number: NonZeroU8::new(1).unwrap(),
}
}
diff --git a/werewolves-proto/src/lib.rs b/werewolves-proto/src/lib.rs
index 3c5fd7f..3309e21 100644
--- a/werewolves-proto/src/lib.rs
+++ b/werewolves-proto/src/lib.rs
@@ -14,19 +14,3 @@ pub mod modifier;
pub mod nonzero;
pub mod player;
pub mod role;
-
-#[derive(Debug, Error, Clone, Serialize, Deserialize)]
-pub enum MessageError {
- #[error("{0}")]
- GameError(#[from] GameError),
-}
-
-pub(crate) trait MustBeInVillage {
- fn must_be_in_village(self) -> Result;
-}
-
-impl MustBeInVillage for Option {
- fn must_be_in_village(self) -> Result {
- self.ok_or(GameError::CannotFindTargetButShouldBeThere)
- }
-}
diff --git a/werewolves-proto/src/message.rs b/werewolves-proto/src/message.rs
index 557c057..9e42bda 100644
--- a/werewolves-proto/src/message.rs
+++ b/werewolves-proto/src/message.rs
@@ -38,22 +38,6 @@ pub struct DayCharacter {
pub alive: bool,
}
-#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
-pub struct Target {
- pub character_id: CharacterId,
- pub public: PublicIdentity,
-}
-
-impl Display for Target {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- let Target {
- character_id,
- public,
- } = self;
- write!(f, "{public} [(c){character_id}]")
- }
-}
-
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ServerMessage {
Disconnect,
diff --git a/werewolves-proto/src/message/host.rs b/werewolves-proto/src/message/host.rs
index 0c00be8..a78cbd5 100644
--- a/werewolves-proto/src/message/host.rs
+++ b/werewolves-proto/src/message/host.rs
@@ -1,13 +1,12 @@
use core::num::NonZeroU8;
use serde::{Deserialize, Serialize};
-use werewolves_macros::Extract;
use crate::{
error::GameError,
game::{GameOver, GameSettings},
message::{
- PublicIdentity, Target,
+ CharacterIdentity, PublicIdentity,
night::{ActionPrompt, ActionResponse, ActionResult},
},
player::{CharacterId, PlayerId},
@@ -55,6 +54,7 @@ impl From for HostGameMessage {
pub enum HostLobbyMessage {
GetState,
Kick(PlayerId),
+ SetPlayerNumber(PlayerId, NonZeroU8),
GetGameSettings,
SetGameSettings(GameSettings),
Start,
@@ -69,13 +69,13 @@ pub enum ServerToHostMessage {
day: NonZeroU8,
},
ActionPrompt(ActionPrompt),
- ActionResult(Option, ActionResult),
+ ActionResult(Option, ActionResult),
Lobby(Box<[PlayerState]>),
GameSettings(GameSettings),
Error(GameError),
GameOver(GameOver),
WaitingForRoleRevealAcks {
- ackd: Box<[Target]>,
- waiting: Box<[Target]>,
+ ackd: Box<[CharacterIdentity]>,
+ waiting: Box<[CharacterIdentity]>,
},
}
diff --git a/werewolves-proto/src/message/ident.rs b/werewolves-proto/src/message/ident.rs
index 6a4d5c5..7a49c23 100644
--- a/werewolves-proto/src/message/ident.rs
+++ b/werewolves-proto/src/message/ident.rs
@@ -14,34 +14,70 @@ pub struct Identification {
pub public: PublicIdentity,
}
-#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
+#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct PublicIdentity {
pub name: String,
pub pronouns: Option,
- pub number: NonZeroU8,
+ pub number: Option,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CharacterIdentity {
pub character_id: CharacterId,
- pub public: PublicIdentity,
+ pub name: String,
+ pub pronouns: Option,
+ pub number: NonZeroU8,
}
-impl CharacterIdentity {
- pub const fn new(character_id: CharacterId, public: PublicIdentity) -> Self {
+impl From for PublicIdentity {
+ fn from(c: CharacterIdentity) -> Self {
Self {
- character_id,
- public,
+ name: c.name,
+ pronouns: c.pronouns,
+ number: Some(c.number),
}
}
}
-impl Default for PublicIdentity {
- fn default() -> Self {
+impl From<&CharacterIdentity> for PublicIdentity {
+ fn from(c: &CharacterIdentity) -> Self {
Self {
- name: Default::default(),
- pronouns: Default::default(),
- number: NonZeroU8::new(1).unwrap(),
+ name: c.name.clone(),
+ pronouns: c.pronouns.clone(),
+ number: Some(c.number),
+ }
+ }
+}
+
+impl Display for CharacterIdentity {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let CharacterIdentity {
+ character_id,
+ name,
+ pronouns,
+ number,
+ } = self;
+ let pronouns = pronouns
+ .as_ref()
+ .map(|p| format!(" ({p})"))
+ .unwrap_or_default();
+
+ write!(f, "[{number}] {name}{pronouns} <<{character_id}>>")
+ }
+}
+
+impl CharacterIdentity {
+ pub const fn new(
+ character_id: CharacterId,
+ name: String,
+ pronouns: Option,
+ number: NonZeroU8,
+ ) -> Self {
+ Self {
+ name,
+ number,
+ pronouns,
+ character_id,
}
}
}
@@ -57,7 +93,11 @@ impl Display for PublicIdentity {
.as_ref()
.map(|p| format!(" ({p})"))
.unwrap_or_default();
- write!(f, "[{number}] {name}{pronouns}")
+ let number = number
+ .as_ref()
+ .map(|n| format!("[{n}] "))
+ .unwrap_or_default();
+ write!(f, "{number}{name}{pronouns}")
}
}
@@ -83,8 +123,7 @@ pub struct PlayerState {
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CharacterState {
pub player_id: PlayerId,
- pub character_id: CharacterId,
- pub public_identity: PublicIdentity,
+ pub identity: CharacterIdentity,
pub role: RoleTitle,
pub died_to: Option,
}
diff --git a/werewolves-proto/src/message/night.rs b/werewolves-proto/src/message/night.rs
index 866a8bb..28a208f 100644
--- a/werewolves-proto/src/message/night.rs
+++ b/werewolves-proto/src/message/night.rs
@@ -7,8 +7,6 @@ use crate::{
role::{Alignment, PreviousGuardianAction, RoleTitle},
};
-use super::Target;
-
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd)]
pub enum ActionType {
Cover,
@@ -40,7 +38,9 @@ pub enum ActionPrompt {
CoverOfDarkness,
#[checks(ActionType::WolfPackKill)]
#[checks]
- WolvesIntro { wolves: Box<[(Target, RoleTitle)]> },
+ WolvesIntro {
+ wolves: Box<[(CharacterIdentity, RoleTitle)]>,
+ },
#[checks(ActionType::RoleChange)]
RoleChange {
character_id: CharacterIdentity,
@@ -49,59 +49,61 @@ pub enum ActionPrompt {
#[checks(ActionType::Other)]
Seer {
character_id: CharacterIdentity,
- living_players: Box<[Target]>,
+ living_players: Box<[CharacterIdentity]>,
},
#[checks(ActionType::Protect)]
Protector {
character_id: CharacterIdentity,
- targets: Box<[Target]>,
+ targets: Box<[CharacterIdentity]>,
},
#[checks(ActionType::Other)]
Arcanist {
character_id: CharacterIdentity,
- living_players: Box<[Target]>,
+ living_players: Box<[CharacterIdentity]>,
},
#[checks(ActionType::Other)]
Gravedigger {
character_id: CharacterIdentity,
- dead_players: Box<[Target]>,
+ dead_players: Box<[CharacterIdentity]>,
},
#[checks(ActionType::Other)]
Hunter {
character_id: CharacterIdentity,
- current_target: Option,
- living_players: Box<[Target]>,
+ current_target: Option,
+ living_players: Box<[CharacterIdentity]>,
},
#[checks(ActionType::Other)]
Militia {
character_id: CharacterIdentity,
- living_players: Box<[Target]>,
+ living_players: Box<[CharacterIdentity]>,
},
#[checks(ActionType::Other)]
MapleWolf {
character_id: CharacterIdentity,
kill_or_die: bool,
- living_players: Box<[Target]>,
+ living_players: Box<[CharacterIdentity]>,
},
#[checks(ActionType::Protect)]
Guardian {
character_id: CharacterIdentity,
previous: Option,
- living_players: Box<[Target]>,
+ living_players: Box<[CharacterIdentity]>,
},
#[checks(ActionType::WolfPackKill)]
- WolfPackKill { living_villagers: Box<[Target]> },
+ WolfPackKill {
+ living_villagers: Box<[CharacterIdentity]>,
+ },
#[checks(ActionType::OtherWolf)]
Shapeshifter { character_id: CharacterIdentity },
#[checks(ActionType::OtherWolf)]
AlphaWolf {
character_id: CharacterIdentity,
- living_villagers: Box<[Target]>,
+ living_villagers: Box<[CharacterIdentity]>,
},
#[checks(ActionType::Direwolf)]
DireWolf {
character_id: CharacterIdentity,
- living_players: Box<[Target]>,
+ living_players: Box<[CharacterIdentity]>,
},
}
diff --git a/werewolves-proto/src/player.rs b/werewolves-proto/src/player.rs
index 436f8e8..d74a1c8 100644
--- a/werewolves-proto/src/player.rs
+++ b/werewolves-proto/src/player.rs
@@ -6,7 +6,7 @@ use crate::{
diedto::DiedTo,
error::GameError,
game::{DateTime, Village},
- message::{CharacterIdentity, Identification, PublicIdentity, Target, night::ActionPrompt},
+ message::{CharacterIdentity, Identification, PublicIdentity, night::ActionPrompt},
modifier::Modifier,
role::{MAPLE_WOLF_ABSTAIN_LIMIT, PreviousGuardianAction, Role, RoleTitle},
};
@@ -77,8 +77,7 @@ pub enum KillOutcome {
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Character {
player_id: PlayerId,
- character_id: CharacterId,
- public: PublicIdentity,
+ identity: CharacterIdentity,
role: Role,
modifier: Option,
died_to: Option,
@@ -93,46 +92,47 @@ pub struct RoleChange {
}
impl Character {
- pub fn new(Identification { player_id, public }: Identification, role: Role) -> Self {
- Self {
- role,
- public,
+ pub fn new(
+ Identification {
+ player_id,
+ public:
+ PublicIdentity {
+ name,
+ pronouns,
+ number,
+ },
+ }: Identification,
+ role: Role,
+ ) -> Option {
+ Some(Self {
+ role,
+ identity: CharacterIdentity {
+ character_id: CharacterId::new(),
+ name,
+ pronouns,
+ number: number?,
+ },
player_id,
- character_id: CharacterId::new(),
modifier: None,
died_to: None,
role_changes: Vec::new(),
- }
+ })
}
- pub fn target(&self) -> Target {
- Target {
- character_id: self.character_id.clone(),
- public: self.public.clone(),
- }
- }
-
- pub const fn public_identity(&self) -> &PublicIdentity {
- &self.public
- }
-
- pub fn character_identity(&self) -> CharacterIdentity {
- CharacterIdentity {
- character_id: self.character_id.clone(),
- public: self.public.clone(),
- }
+ pub fn identity(&self) -> CharacterIdentity {
+ self.identity.clone()
}
pub fn name(&self) -> &str {
- &self.public.name
+ self.identity.name.as_str()
}
pub const fn number(&self) -> NonZeroU8 {
- self.public.number
+ self.identity.number
}
pub const fn pronouns(&self) -> Option<&str> {
- match self.public.pronouns.as_ref() {
+ match self.identity.pronouns.as_ref() {
Some(p) => Some(p.as_str()),
None => None,
}
@@ -162,7 +162,7 @@ impl Character {
}
pub const fn character_id(&self) -> &CharacterId {
- &self.character_id
+ &self.identity.character_id
}
pub const fn player_id(&self) -> &PlayerId {
@@ -220,24 +220,24 @@ impl Character {
| Role::Scapegoat
| Role::Villager => return Ok(None),
Role::Seer => ActionPrompt::Seer {
- character_id: self.character_identity(),
- living_players: village.living_players_excluding(&self.character_id),
+ character_id: self.identity(),
+ living_players: village.living_players_excluding(self.character_id()),
},
Role::Arcanist => ActionPrompt::Arcanist {
- character_id: self.character_identity(),
- living_players: village.living_players_excluding(&self.character_id),
+ character_id: self.identity(),
+ living_players: village.living_players_excluding(self.character_id()),
},
Role::Protector {
last_protected: Some(last_protected),
} => ActionPrompt::Protector {
- character_id: self.character_identity(),
+ character_id: self.identity(),
targets: village.living_players_excluding(last_protected),
},
Role::Protector {
last_protected: None,
} => ActionPrompt::Protector {
- character_id: self.character_identity(),
- targets: village.living_players_excluding(&self.character_id),
+ character_id: self.identity(),
+ targets: village.living_players_excluding(self.character_id()),
},
Role::Apprentice(role) => {
let current_night = match village.date_time() {
@@ -254,7 +254,7 @@ impl Character {
DateTime::Night { number } => number + 1 >= current_night,
})
.then(|| ActionPrompt::RoleChange {
- character_id: self.character_identity(),
+ character_id: self.identity(),
new_role: role.title(),
}));
}
@@ -265,61 +265,61 @@ impl Character {
};
return Ok((current_night == knows_on_night.get()).then_some({
ActionPrompt::RoleChange {
- character_id: self.character_identity(),
+ character_id: self.identity(),
new_role: RoleTitle::Elder,
}
}));
}
Role::Militia { targeted: None } => ActionPrompt::Militia {
- character_id: self.character_identity(),
- living_players: village.living_players_excluding(&self.character_id),
+ character_id: self.identity(),
+ living_players: village.living_players_excluding(self.character_id()),
},
Role::Werewolf => ActionPrompt::WolfPackKill {
living_villagers: village.living_players(),
},
Role::AlphaWolf { killed: None } => ActionPrompt::AlphaWolf {
- character_id: self.character_identity(),
- living_villagers: village.living_players_excluding(&self.character_id),
+ character_id: self.identity(),
+ living_villagers: village.living_players_excluding(self.character_id()),
},
Role::DireWolf => ActionPrompt::DireWolf {
- character_id: self.character_identity(),
+ character_id: self.identity(),
living_players: village.living_players(),
},
Role::Shapeshifter { shifted_into: None } => ActionPrompt::Shapeshifter {
- character_id: self.character_identity(),
+ character_id: self.identity(),
},
Role::Gravedigger => ActionPrompt::Gravedigger {
- character_id: self.character_identity(),
+ character_id: self.identity(),
dead_players: village.dead_targets(),
},
Role::Hunter { target } => ActionPrompt::Hunter {
- character_id: self.character_identity(),
+ character_id: self.identity(),
current_target: target.as_ref().and_then(|t| village.target_by_id(t)),
- living_players: village.living_players_excluding(&self.character_id),
+ living_players: village.living_players_excluding(self.character_id()),
},
Role::MapleWolf { last_kill_on_night } => ActionPrompt::MapleWolf {
- character_id: self.character_identity(),
+ character_id: self.identity(),
kill_or_die: last_kill_on_night + MAPLE_WOLF_ABSTAIN_LIMIT.get() == night,
- living_players: village.living_players_excluding(&self.character_id),
+ living_players: village.living_players_excluding(self.character_id()),
},
Role::Guardian {
last_protected: Some(PreviousGuardianAction::Guard(prev_target)),
} => ActionPrompt::Guardian {
- character_id: self.character_identity(),
+ character_id: self.identity(),
previous: Some(PreviousGuardianAction::Guard(prev_target.clone())),
living_players: village.living_players_excluding(&prev_target.character_id),
},
Role::Guardian {
last_protected: Some(PreviousGuardianAction::Protect(prev_target)),
} => ActionPrompt::Guardian {
- character_id: self.character_identity(),
+ character_id: self.identity(),
previous: Some(PreviousGuardianAction::Protect(prev_target.clone())),
living_players: village.living_players(),
},
Role::Guardian {
last_protected: None,
} => ActionPrompt::Guardian {
- character_id: self.character_identity(),
+ character_id: self.identity(),
previous: None,
living_players: village.living_players(),
},
diff --git a/werewolves-proto/src/role.rs b/werewolves-proto/src/role.rs
index cc2aa1a..cb59a84 100644
--- a/werewolves-proto/src/role.rs
+++ b/werewolves-proto/src/role.rs
@@ -5,7 +5,7 @@ use werewolves_macros::{ChecksAs, Titles};
use crate::{
game::{DateTime, Village},
- message::Target,
+ message::CharacterIdentity,
player::CharacterId,
};
@@ -178,6 +178,6 @@ pub enum RoleBlock {
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum PreviousGuardianAction {
- Protect(Target),
- Guard(Target),
+ Protect(CharacterIdentity),
+ Guard(CharacterIdentity),
}
diff --git a/werewolves-server/Cargo.toml b/werewolves-server/Cargo.toml
index f635740..f4fe802 100644
--- a/werewolves-server/Cargo.toml
+++ b/werewolves-server/Cargo.toml
@@ -5,7 +5,7 @@ edition = "2024"
[dependencies]
axum = { version = "0.8", features = ["ws"] }
-tokio = { version = "1.44", features = ["full"] }
+tokio = { version = "1.47", features = ["full"] }
log = { version = "0.4" }
pretty_env_logger = { version = "0.5" }
# env_logger = { version = "0.11" }
diff --git a/werewolves-server/src/client.rs b/werewolves-server/src/client.rs
index 77965e3..5647ced 100644
--- a/werewolves-server/src/client.rs
+++ b/werewolves-server/src/client.rs
@@ -121,7 +121,7 @@ struct Client {
who: String,
sender: Sender,
receiver: Receiver,
- message_history: Vec,
+ // message_history: Vec,
}
impl Client {
@@ -140,7 +140,7 @@ impl Client {
who,
sender,
receiver,
- message_history: Vec::new(),
+ // message_history: Vec::new(),
}
}
#[cfg(feature = "cbor")]
@@ -193,7 +193,7 @@ impl Client {
if let ClientMessage::UpdateSelf(update) = &message {
match update {
UpdateSelf::Name(name) => self.ident.public.name = name.clone(),
- UpdateSelf::Number(num) => self.ident.public.number = *num,
+ UpdateSelf::Number(num) => self.ident.public.number = Some(*num),
UpdateSelf::Pronouns(pronouns) => self.ident.public.pronouns = pronouns.clone(),
}
}
@@ -221,7 +221,7 @@ impl Client {
})
})
.await?;
- self.message_history.push(message);
+ // self.message_history.push(message);
Ok(())
}
diff --git a/werewolves-server/src/communication/player.rs b/werewolves-server/src/communication/player.rs
index 32fce4d..8b7da99 100644
--- a/werewolves-server/src/communication/player.rs
+++ b/werewolves-server/src/communication/player.rs
@@ -1,35 +1,25 @@
-use core::time::Duration;
-use std::collections::HashMap;
-
use colored::Colorize;
-use tokio::{
- sync::broadcast::{Receiver, Sender},
- time::Instant,
-};
-use werewolves_proto::{
- error::GameError,
- message::{ClientMessage, ServerMessage, Target, night::ActionResponse},
- player::{Character, CharacterId, PlayerId},
-};
+use tokio::sync::broadcast::Receiver;
+use werewolves_proto::{error::GameError, player::PlayerId};
use crate::{connection::JoinedPlayers, runner::IdentifiedClientMessage};
pub struct PlayerIdComms {
- joined_players: JoinedPlayers,
+ // joined_players: JoinedPlayers,
message_recv: Receiver,
- connect_recv: tokio::sync::broadcast::Receiver<(PlayerId, bool)>,
+ // connect_recv: tokio::sync::broadcast::Receiver<(PlayerId, bool)>,
}
impl PlayerIdComms {
pub fn new(
- joined_players: JoinedPlayers,
+ // joined_players: JoinedPlayers,
message_recv: Receiver,
- connect_recv: tokio::sync::broadcast::Receiver<(PlayerId, bool)>,
+ // connect_recv: tokio::sync::broadcast::Receiver<(PlayerId, bool)>,
) -> Self {
Self {
- joined_players,
+ // joined_players,
message_recv,
- connect_recv,
+ // connect_recv,
}
}
diff --git a/werewolves-server/src/connection.rs b/werewolves-server/src/connection.rs
index ad88000..02b9a97 100644
--- a/werewolves-server/src/connection.rs
+++ b/werewolves-server/src/connection.rs
@@ -36,7 +36,7 @@ pub struct JoinedPlayer {
active_connection: ConnectionId,
in_game: bool,
pub name: String,
- pub number: NonZeroU8,
+ pub number: Option,
pub pronouns: Option,
}
@@ -46,7 +46,7 @@ impl JoinedPlayer {
receiver: Receiver,
active_connection: ConnectionId,
name: String,
- number: NonZeroU8,
+ number: Option,
pronouns: Option,
) -> Self {
Self {
@@ -111,6 +111,16 @@ impl JoinedPlayers {
}
}
+ pub async fn get_player_identity(&self, player_id: &PlayerId) -> Option {
+ self.players.lock().await.iter().find_map(|(id, p)| {
+ (id == player_id).then(|| PublicIdentity {
+ name: p.name.clone(),
+ pronouns: p.pronouns.clone(),
+ number: p.number,
+ })
+ })
+ }
+
/// Disconnect the player
///
/// Will not disconnect if the player is currently in a game, allowing them to reconnect
diff --git a/werewolves-server/src/game.rs b/werewolves-server/src/game.rs
index 7bafd24..e7a1028 100644
--- a/werewolves-server/src/game.rs
+++ b/werewolves-server/src/game.rs
@@ -3,7 +3,7 @@ use core::ops::Not;
use crate::{
LogError,
communication::{Comms, lobby::LobbyComms},
- connection::{InGameToken, JoinedPlayers},
+ connection::JoinedPlayers,
lobby::{Lobby, LobbyPlayers},
runner::{IdentifiedClientMessage, Message},
};
@@ -13,7 +13,7 @@ use werewolves_proto::{
game::{Game, GameOver, Village},
message::{
ClientMessage, Identification, ServerMessage,
- host::{HostGameMessage, HostMessage, HostNightMessage, ServerToHostMessage},
+ host::{HostGameMessage, HostMessage, ServerToHostMessage},
},
player::{Character, PlayerId},
};
@@ -94,11 +94,11 @@ impl GameRunner {
.send(ServerToHostMessage::WaitingForRoleRevealAcks {
ackd: acks
.iter()
- .filter_map(|(a, ackd)| ackd.then_some(a.target()))
+ .filter_map(|(a, ackd)| ackd.then_some(a.identity()))
.collect(),
waiting: acks
.iter()
- .filter_map(|(a, ackd)| ackd.not().then_some(a.target()))
+ .filter_map(|(a, ackd)| ackd.not().then_some(a.identity()))
.collect(),
})
.log_err();
diff --git a/werewolves-server/src/lobby.rs b/werewolves-server/src/lobby.rs
index 97ae968..15d69ad 100644
--- a/werewolves-server/src/lobby.rs
+++ b/werewolves-server/src/lobby.rs
@@ -3,7 +3,7 @@ use core::{
ops::{Deref, DerefMut},
time::Duration,
};
-use std::collections::HashMap;
+use std::{collections::HashMap, os::unix::raw::pid_t};
use serde::{Deserialize, Serialize};
use tokio::sync::broadcast::Sender;
@@ -178,6 +178,21 @@ impl Lobby {
settings.check()?;
self.settings = settings;
}
+ Message::Host(HostMessage::Lobby(HostLobbyMessage::SetPlayerNumber(pid, num))) => {
+ self.joined_players
+ .update(&pid, |p| p.number = Some(num))
+ .await;
+ if let Some(p) = self
+ .players_in_lobby
+ .iter_mut()
+ .find_map(|(c, _)| (c.player_id == pid).then_some(c))
+ && let Some(joined_id) = self.joined_players.get_player_identity(&pid).await
+ {
+ p.public = joined_id;
+ }
+ self.send_lobby_info_to_clients().await;
+ self.send_lobby_info_to_host().await.log_debug();
+ }
Message::Host(HostMessage::Lobby(HostLobbyMessage::Start)) => {
if self.players_in_lobby.len() < self.settings.min_players_needed() {
return Err(GameError::TooFewPlayers {
@@ -275,12 +290,19 @@ impl Lobby {
message: ClientMessage::UpdateSelf(_),
}) => {
self.joined_players
- .update(&player_id, move |p| {
- p.name = public.name;
+ .update(&player_id, |p| {
+ p.name = public.name.clone();
p.number = public.number;
- p.pronouns = public.pronouns;
+ p.pronouns = public.pronouns.clone();
})
.await;
+ if let Some(p) = self
+ .players_in_lobby
+ .iter_mut()
+ .find_map(|(c, _)| (c.player_id == player_id).then_some(c))
+ {
+ p.public = public;
+ }
self.send_lobby_info_to_clients().await;
self.send_lobby_info_to_host().await.log_debug();
}
diff --git a/werewolves-server/src/main.rs b/werewolves-server/src/main.rs
index 3f3d439..a9b9c69 100644
--- a/werewolves-server/src/main.rs
+++ b/werewolves-server/src/main.rs
@@ -101,7 +101,11 @@ async fn main() {
let lobby_comms = LobbyComms::new(
Comms::new(
HostComms::new(server_send, server_recv),
- PlayerIdComms::new(joined_players.clone(), recv, connect_recv.resubscribe()),
+ PlayerIdComms::new(
+ //joined_players.clone(),
+ recv,
+ // connect_recv.resubscribe()
+ ),
),
connect_recv,
);
diff --git a/werewolves/Cargo.toml b/werewolves/Cargo.toml
index a0bff82..1219dda 100644
--- a/werewolves/Cargo.toml
+++ b/werewolves/Cargo.toml
@@ -14,12 +14,13 @@ web-sys = { version = "0.3", features = [
"HtmlDivElement",
"HtmlSelectElement",
] }
+wasm-bindgen = { version = "=0.2.100" }
log = "0.4"
rand = { version = "0.9", features = ["small_rng"] }
getrandom = { version = "0.3", features = ["wasm_js"] }
uuid = { version = "*", features = ["js"] }
yew = { version = "0.21", features = ["csr"] }
-yew-router = "0.18.0"
+yew-router = "0.18"
serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0", optional = true }
gloo = "0.11"
@@ -29,8 +30,8 @@ once_cell = "1"
chrono = { version = "0.4" }
werewolves-macros = { path = "../werewolves-macros" }
werewolves-proto = { path = "../werewolves-proto" }
-futures = "0.3.31"
-wasm-bindgen-futures = "0.4.50"
+futures = "0.3"
+wasm-bindgen-futures = "0.4"
thiserror = { version = "2" }
convert_case = { version = "0.8" }
ciborium = { version = "0.2", optional = true }
diff --git a/werewolves/index.html b/werewolves/index.html
index 59c75ac..c87d84d 100644
--- a/werewolves/index.html
+++ b/werewolves/index.html
@@ -14,12 +14,12 @@
-
+
diff --git a/werewolves/index.scss b/werewolves/index.scss
index f5e3b63..cfedac1 100644
--- a/werewolves/index.scss
+++ b/werewolves/index.scss
@@ -54,43 +54,86 @@ nav.debug-nav {
}
-.button-container {
- button {
- font-size: 1.3rem;
- border: 1px solid rgba(255, 255, 255, 1);
- padding: 5px;
- background-color: rgba(0, 0, 0, 0.3);
- color: #cccccc;
- cursor: pointer;
+.default-button {
+ font-size: 1.3rem;
+ border: 1px solid rgba(255, 255, 255, 1);
+ padding: 5px;
+ background-color: black;
+ color: #cccccc;
+ cursor: pointer;
+
+ &:hover {
+ background-color: white;
+ color: invert(#cccccc);
}
-
- button:hover {
- filter: $link_select_filter;
- }
-
- // button {
- // color: #fff;
- // background: transparent;
- // background-repeat: no-repeat;
- // cursor: pointer;
- // overflow: hidden;
- // outline: none;
- // padding: 0px;
-
- // &:hover {
- // background-color: rgba(0, 0, 0, 0.5);
- // }
- // }
}
-.player .number {
- padding-top: 3px;
+.player {
margin: 0px;
+ // padding-left: 5px;
+ // padding-right: 5px;
+ // padding-bottom: 5px;
+ min-width: 10rem;
+ max-width: 10vw;
+ max-height: 4rem;
+ text-align: center;
+
+ justify-content: center;
+ font-family: 'Cute Font';
+
+ &.marked {
+ // background-color: brighten($village_color, 100%);
+ filter: hue-rotate(90deg);
+ }
+
+ &.connected {}
+
+ &.disconnected {
+ // background-color: $disconnected_color;
+ // border: 3px solid darken($disconnected_color, 20%);
+ }
+
+ &.dead {
+ filter: grayscale(100%);
+ }
+
+ .number {
+ padding-top: 3px;
+ margin: 0px;
+
+ &.not-set {
+ border: 2px solid rgba(255, 0, 0, 0.3);
+ background-color: rgba(255, 0, 0, 0.7);
+ }
+ }
}
-.player:hover {
- filter: brightness(120%);
+.submenu {
+ background-color: black;
+ border: 1px solid rgba(255, 255, 255, 0.7);
+ padding: 10px;
+ // position: absolute;
+ position: relative;
+
+ // top: 1px;
+ align-self: stretch;
+ z-index: 5;
+
+ & button {
+ width: 100%;
+ }
+}
+
+.click-backdrop {
+ z-index: 4;
+ background-color: rgba(0, 0, 0, 0.7);
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 200vh;
+ width: 100vw;
+ background-size: cover;
}
.player-container {
@@ -137,41 +180,37 @@ button {
border: none;
- width: fit-content;
- height: fit-content;
outline: inherit;
padding-left: 5px;
padding-right: 5px;
+ background-color: #000;
+
+ &:disabled {
+ filter: grayscale(80%);
+ }
+
+ &:disabled:hover {
+ filter: sepia(100%);
+ }
+
+ &:disabled:hover::after {
+ content: attr(reason);
+ position: absolute;
+ margin-top: 10px;
+ top: 90%;
+ font: 'Cute Font';
+ // color: #000;
+ // background-color: #fff;
+ color: rgba(255, 0, 0, 1);
+ background-color: rgba(255, 0, 0, 0.3);
+ border: 1px solid rgba(255, 0, 0, 0.3);
+ min-width: 50vw;
+ width: fit-content;
+ padding: 3px;
+ z-index: 4;
+ }
}
-button:disabled {
- filter: grayscale(80%);
-}
-
-button:hover {
- filter: brightness(80%);
-}
-
-button:disabled:hover {
- filter: sepia(100%);
-}
-
-button:disabled:hover::after {
- content: attr(reason);
- position: absolute;
- margin-top: 10px;
- top: 90%;
- font: 'Cute Font';
- // color: #000;
- // background-color: #fff;
- color: rgba(255, 0, 0, 1);
- background-color: rgba(255, 0, 0, 0.3);
- border: 1px solid rgba(255, 0, 0, 0.3);
- min-width: 50vw;
- width: fit-content;
- padding: 3px;
- z-index: 3;
-}
.settings {
list-style: none;
@@ -396,7 +435,6 @@ client {
font-family: 'Cute Font';
// font-size: 0.7rem;
- background-color: hsl(280, 55%, 61%);
display: flex;
// flex-wrap: wrap;
flex-direction: column;
@@ -405,7 +443,6 @@ client {
padding: 30px;
gap: 30px;
- filter: $client_filter;
border: 2px solid black;
}
@@ -414,17 +451,10 @@ clients {
font-family: 'Cute Font';
// font-size: 0.7rem;
- background-color: white;
display: flex;
flex-wrap: wrap;
flex-direction: row;
font-size: 2rem;
- margin-left: 20px;
- margin-right: 20px;
-
- gap: 10px;
- border: solid 3px;
- border-color: #432054;
}
.role-reveal-cards {
@@ -550,6 +580,19 @@ clients {
font-size: 1.2rem;
}
+.client-nav {
+ // position: absolute;
+ // left: 0;
+ // top: 0;
+ width: 100%;
+ padding: 10px;
+ // background-color: rgba(255, 107, 255, 0.2);
+ display: flex;
+ flex-direction: row;
+ justify-content: baseline;
+ gap: 10px;
+}
+
.ident {
gap: 0px;
margin: 0px;
@@ -558,10 +601,11 @@ clients {
.submenu {
margin-top: 10px;
margin-bottom: 10px;
- display: flex;
+ // display: flex;
justify-content: center;
// visibility: collapse;
display: none;
+ z-index: 5;
.button-container {
display: flex;
@@ -571,6 +615,9 @@ clients {
&.shown {
// visibility: visible;
display: flex;
+ flex-direction: row;
+ align-items: baseline;
+ // position: absolute;
}
button {
@@ -617,40 +664,14 @@ error {
}
}
-
-
-
-.player {
-
- margin: 0px;
- padding-left: 5px;
- padding-right: 5px;
- text-align: center;
-
- justify-content: center;
- font-family: 'Cute Font';
-
- background-color: $village_color;
- border: 3px solid darken($village_color, 20%);
-
- &.marked {
- // background-color: brighten($village_color, 100%);
- filter: hue-rotate(90deg);
- }
-
- &.connected {
- background-color: $connected_color;
- border: 3px solid darken($connected_color, 20%);
- }
-
- &.disconnected {
- background-color: $disconnected_color;
- border: 3px solid darken($disconnected_color, 20%);
- }
-
- &.dead {
- filter: grayscale(100%);
- }
+.player-list {
+ padding-bottom: 80px;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 10px;
+ // align-items: center;
+ justify-content: space-evenly;
}
.binary {
@@ -674,3 +695,45 @@ error {
}
}
}
+
+input {
+ background-color: rgba(255, 255, 255, 0.1);
+ color: white;
+ border: 2px solid rgba(255, 255, 255, 0.2);
+ margin: 10px;
+}
+
+.signin {
+ @extend .row-list;
+ justify-content: center;
+ text-align: center;
+
+ & label {
+ font-size: 1.5rem;
+ }
+
+ & input {
+ height: 2rem;
+ text-align: center;
+
+ number {
+ font-size: 2rem;
+ }
+ }
+}
+
+.info-update {
+ font-size: 2rem;
+ align-content: stretch;
+ margin: 0;
+
+ & * {
+ margin: 0;
+ width: 100%;
+ text-align: center;
+ }
+}
+
+.zoom {
+ zoom: 200%;
+}
diff --git a/werewolves/src/clients/client/client.rs b/werewolves/src/clients/client/client.rs
index 7095742..32244c6 100644
--- a/werewolves/src/clients/client/client.rs
+++ b/werewolves/src/clients/client/client.rs
@@ -1,4 +1,4 @@
-use core::{sync::atomic::AtomicBool, time::Duration};
+use core::{num::NonZeroU8, sync::atomic::AtomicBool, time::Duration};
use std::collections::VecDeque;
use futures::{
@@ -16,7 +16,6 @@ use werewolves_proto::{
game::GameOver,
message::{
ClientMessage, DayCharacter, Identification, PlayerUpdate, PublicIdentity, ServerMessage,
- Target,
night::{ActionPrompt, ActionResponse, ActionResult},
},
player::PlayerId,
@@ -25,7 +24,10 @@ use werewolves_proto::{
use yew::{html::Scope, prelude::*};
use crate::{
- components::{InputName, Notification},
+ components::{
+ Button, Identity, Notification,
+ client::{ClientNav, InputName},
+ },
storage::StorageKey,
};
@@ -50,8 +52,8 @@ fn url() -> String {
format!(
"{}client",
option_env!("LOCAL")
- .map(|_| super::DEBUG_URL)
- .unwrap_or(super::LIVE_URL)
+ .map(|_| crate::clients::DEBUG_URL)
+ .unwrap_or(crate::clients::LIVE_URL)
)
}
@@ -185,7 +187,6 @@ impl Connection {
#[derive(PartialEq)]
pub enum ClientEvent {
Disconnected,
- Notification(String),
Waiting,
ShowRole(RoleTitle),
NotInLobby(Box<[PublicIdentity]>),
@@ -201,13 +202,17 @@ impl TryFrom for ClientEvent {
Ok(match msg {
ServerMessage::Disconnect => Self::Disconnected,
ServerMessage::LobbyInfo {
- joined: false,
- players,
- } => Self::NotInLobby(players),
- ServerMessage::LobbyInfo {
- joined: true,
- players,
- } => Self::InLobby(players),
+ joined,
+ mut players,
+ } => {
+ const LAST: NonZeroU8 = NonZeroU8::new(0xFF).unwrap();
+ players.sort_by(|l, r| l.number.unwrap_or(LAST).cmp(&r.number.unwrap_or(LAST)));
+ let players = players.into_iter().collect();
+ match joined {
+ true => Self::InLobby(players),
+ false => Self::NotInLobby(players),
+ }
+ }
ServerMessage::GameInProgress => Self::GameInProgress,
_ => return Err(msg),
})
@@ -251,10 +256,9 @@ impl Component for Client {
fn create(ctx: &Context) -> Self {
gloo::utils::document().set_title("Werewolves Player");
- let player = StorageKey::PlayerId
- .get()
+ let player = PlayerId::load_from_storage()
.ok()
- .and_then(|p| StorageKey::PublicIdentity.get().ok().map(|n| (p, n)))
+ .and_then(|p| PublicIdentity::load_from_storage().ok().map(|n| (p, n)))
.map(|(player_id, public)| Identification { player_id, public });
let (send, recv) = futures::channel::mpsc::channel::(100);
@@ -337,11 +341,11 @@ impl Component for Client {
);
html! {
+
{format!("Players in lobby: {}", players.len())}
{players.iter().map(|p| html!{{p.to_string()}
}).collect::()}
-
}
}
@@ -355,11 +359,11 @@ impl Component for Client {
);
html! {
+
{format!("Players in lobby: {}", players.len())}
{players.iter().map(|p| html!{{p.to_string()}
}).collect::()}
-
}
}
@@ -378,43 +382,42 @@ impl Component for Client {
}}
},
- ClientEvent::Notification(notification) => {
- let scope = ctx.link().clone();
- let next_event =
- // Callback::from(move |_| scope.clone().send_message(Message::));
- Callback::from(move |_| log::info!("nothing"));
- html! {
-
- }
- }
};
let player = self
.player
.as_ref()
.map(|player| {
- let pronouns = if let Some(pronouns) = player.public.pronouns.as_ref() {
- html! {
- {"("}{pronouns.as_str()}{")"}
- }
- } else {
- html!()
- };
html! {
-
- {player.public.number.get()}
- {player.public.name.clone()}
- {pronouns}
-
+
+
}
})
.unwrap_or(html!());
+ let send = self.send.clone();
+ let client_nav_msg_cb = move |msg| {
+ let mut send = send.clone();
+ yew::platform::spawn_local(async move {
+ if let Err(err) = send.send(msg).await {
+ log::error!("sending nav message: {err}");
+ }
+ });
+ };
+ let nav = self.player.as_ref().map(|_| {
+ html! {
+
+ }
+ });
+
html! {
-
- {player}
- {content}
-
+ <>
+ {nav}
+
+ {player}
+ {content}
+
+ >
}
}
@@ -431,34 +434,45 @@ impl Component for Client {
}
Message::SetPublicIdentity(public) => {
match self.player.as_mut() {
- Some(p) => p.public = public,
+ Some(p) => {
+ if let Err(err) = public.save_to_storage() {
+ self.error(err.into());
+ return false;
+ }
+ p.public = public;
+ }
None => {
- let res =
- StorageKey::PlayerId
- .get_or_set(PlayerId::new)
- .and_then(|player_id| {
- StorageKey::PublicIdentity
- .set(public.clone())
- .map(|_| Identification { player_id, public })
- });
- match res {
- Ok(ident) => {
- self.player = Some(ident.clone());
- if let Some(recv) = self.recv.take() {
- yew::platform::spawn_local(
- Connection {
- scope: ctx.link().clone(),
- ident,
- recv,
- }
- .run(),
- );
+ let player_id = match PlayerId::load_from_storage() {
+ Ok(pid) => pid,
+ Err(StorageError::KeyNotFound(_)) => {
+ let pid = PlayerId::new();
+ if let Err(err) = pid.save_to_storage() {
+ self.error(err.into());
+ return false;
}
+ pid
}
Err(err) => {
self.error(err.into());
return false;
}
+ };
+ if let Err(err) = public.save_to_storage() {
+ self.error(err.into());
+ return false;
+ }
+ let ident = Identification { player_id, public };
+ self.player = Some(ident.clone());
+
+ if let Some(recv) = self.recv.take() {
+ yew::platform::spawn_local(
+ Connection {
+ recv,
+ ident,
+ scope: ctx.link().clone(),
+ }
+ .run(),
+ );
}
}
}
@@ -469,17 +483,16 @@ impl Component for Client {
joined: false,
players: _,
} = &msg
+ && self.auto_join
{
- if self.auto_join {
- let mut send = self.send.clone();
- yew::platform::spawn_local(async move {
- if let Err(err) = send.send(ClientMessage::Hello).await {
- log::error!("send: {err}");
- }
- });
- self.auto_join = false;
- return false;
- }
+ let mut send = self.send.clone();
+ yew::platform::spawn_local(async move {
+ if let Err(err) = send.send(ClientMessage::Hello).await {
+ log::error!("send: {err}");
+ }
+ });
+ self.auto_join = false;
+ return false;
}
let msg = match msg.try_into() {
Ok(event) => {
@@ -519,7 +532,7 @@ impl Component for Client {
ServerMessage::Sleep => self.current_event = Some(ClientEvent::Waiting),
ServerMessage::Update(update) => match (update, self.player.as_mut()) {
(PlayerUpdate::Number(num), Some(player)) => {
- player.public.number = num;
+ player.public.number = Some(num);
return true;
}
(_, None) => return false,
diff --git a/werewolves/src/clients/host/host.rs b/werewolves/src/clients/host/host.rs
index 62a15e4..12821f4 100644
--- a/werewolves/src/clients/host/host.rs
+++ b/werewolves/src/clients/host/host.rs
@@ -1,4 +1,5 @@
use core::{num::NonZeroU8, ops::Not, time::Duration};
+use std::{rc::Rc, sync::Arc};
use futures::{
SinkExt, StreamExt,
@@ -11,7 +12,7 @@ use werewolves_proto::{
error::GameError,
game::{GameOver, GameSettings},
message::{
- CharacterState, PlayerState, PublicIdentity, Target,
+ CharacterIdentity, CharacterState, PlayerState, PublicIdentity,
host::{
HostDayMessage, HostGameMessage, HostLobbyMessage, HostMessage, HostNightMessage,
ServerToHostMessage,
@@ -37,8 +38,8 @@ fn url() -> String {
format!(
"{}host",
option_env!("LOCAL")
- .map(|_| super::DEBUG_URL)
- .unwrap_or(super::LIVE_URL)
+ .map(|_| crate::clients::DEBUG_URL)
+ .unwrap_or(crate::clients::LIVE_URL)
)
}
@@ -184,7 +185,7 @@ pub enum HostEvent {
pub enum HostState {
Disconnected,
Lobby {
- players: Box<[PlayerState]>,
+ players: Rc<[PlayerState]>,
settings: GameSettings,
},
Day {
@@ -196,11 +197,11 @@ pub enum HostState {
result: GameOver,
},
RoleReveal {
- ackd: Box<[Target]>,
- waiting: Box<[Target]>,
+ ackd: Box<[CharacterIdentity]>,
+ waiting: Box<[CharacterIdentity]>,
},
Prompt(ActionPrompt),
- Result(Option, ActionResult),
+ Result(Option, ActionResult),
}
impl From for HostEvent {
@@ -340,7 +341,7 @@ impl Component for Host {
settings={settings}
on_start={on_start}
on_update={on_changed}
- players_in_lobby={players.len()}
+ players_in_lobby={players.clone()}
/>
}
});
@@ -352,6 +353,9 @@ impl Component for Host {
LobbyPlayerAction::Kick => {
HostMessage::Lobby(HostLobbyMessage::Kick(player_id))
}
+ LobbyPlayerAction::SetNumber(num) => HostMessage::Lobby(
+ HostLobbyMessage::SetPlayerNumber(player_id, num),
+ ),
};
let mut send = send.clone();
let on_error = on_error.clone();
@@ -404,7 +408,7 @@ impl Component for Host {
HostState::RoleReveal { ackd, waiting } => {
let send = self.send.clone();
let on_force_ready = self.big_screen.not().then(|| {
- Callback::from(move |target: Target| {
+ Callback::from(move |target: CharacterIdentity| {
let send = send.clone();
yew::platform::spawn_local(async move {
if let Err(err) = send
@@ -456,7 +460,7 @@ impl Component for Host {
result={result}
big_screen={self.big_screen}
on_complete={on_complete}
- ident={ident}
+ ident={ident.map(|i| i.into())}
/>
}
}
@@ -471,7 +475,7 @@ impl Component for Host {
self.send.clone(),
);
html! {
-