chore: add pumpkin_macros::translate_cross! macro

validates translations at compile time, also update bedrock translations to latest 26.40.5
This commit is contained in:
Alexander Medvedev
2026-08-10 18:11:00 +02:00
parent 366c9cb323
commit 1ee7be3f8c
46 changed files with 42552 additions and 1144 deletions

359
Cargo.lock generated
View File

@@ -40,9 +40,9 @@ dependencies = [
[[package]] [[package]]
name = "aes" name = "aes"
version = "0.9.1" version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1fc76eaeac4c9164506c466d4ffdd8ec9d0c5bf57ee97177c4d8eceb3a0e138" checksum = "f8eb277bec05f56a0e0591f155a484cbd0f4f07ff2905051a48c72f004f7ed58"
dependencies = [ dependencies = [
"cipher 0.5.2", "cipher 0.5.2",
"cpubits", "cpubits",
@@ -65,9 +65,9 @@ dependencies = [
[[package]] [[package]]
name = "aho-corasick" name = "aho-corasick"
version = "1.1.4" version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@@ -179,9 +179,9 @@ dependencies = [
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.91" version = "0.1.92"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -439,9 +439,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.3.0" version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e"
dependencies = [ dependencies = [
"find-msvc-tools", "find-msvc-tools",
"jobserver", "jobserver",
@@ -573,18 +573,18 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.6.4" version = "4.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
] ]
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.6.2" version = "4.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"clap_lex", "clap_lex",
@@ -617,7 +617,7 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1"
dependencies = [ dependencies = [
"thiserror 2.0.19", "thiserror 2.0.20",
] ]
[[package]] [[package]]
@@ -699,9 +699,9 @@ checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c"
[[package]] [[package]]
name = "cookie" name = "cookie"
version = "0.18.1" version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87"
dependencies = [ dependencies = [
"percent-encoding", "percent-encoding",
"time", "time",
@@ -761,27 +761,27 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-assembler-x64" name = "cranelift-assembler-x64"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f0435c6939d6ef218bf0a3063094f2cc5c46f7a44a88f81cf932da8d3922ff8" checksum = "d552bd33b7a56dc70aeb1e1c960e51a218fa0db50f23873b500a310379450b2d"
dependencies = [ dependencies = [
"cranelift-assembler-x64-meta", "cranelift-assembler-x64-meta",
] ]
[[package]] [[package]]
name = "cranelift-assembler-x64-meta" name = "cranelift-assembler-x64-meta"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aca52511cc21a2c9c927aef493d11c8087bdc5483249a3d93aee41e81b8bd4d1" checksum = "078e80e4c222279e3330f6aa1a256ca77ddf156d4453166a9f09defedc4594dd"
dependencies = [ dependencies = [
"cranelift-srcgen", "cranelift-srcgen",
] ]
[[package]] [[package]]
name = "cranelift-bforest" name = "cranelift-bforest"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6867e99f068454b0c81c50b807af88aa80aaf383105e2be26675d81fc4278466" checksum = "820ce15d4ad3562d613c31a67b6d0434d403e7091a68d1349903842f7d31737e"
dependencies = [ dependencies = [
"cranelift-entity", "cranelift-entity",
"wasmtime-internal-core", "wasmtime-internal-core",
@@ -789,9 +789,9 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-bitset" name = "cranelift-bitset"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3cf66017aed971344230199ad35ca01c955cf824a0e65fed5240452d2a302445" checksum = "61bca563d4b86d285928d9e27f97f27039bb33a0fc524fa130d7d0c106bf8ab3"
dependencies = [ dependencies = [
"serde", "serde",
"serde_derive", "serde_derive",
@@ -800,9 +800,9 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-codegen" name = "cranelift-codegen"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "933b2e5237665bf9367a34ad2100eed70c94b2796586cb09d9ba11693e061667" checksum = "709f4b7c0fb57d952658d5b5c07fbdc4149acd7b7f0de9678ae754b9c981949a"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"cranelift-assembler-x64", "cranelift-assembler-x64",
@@ -831,9 +831,9 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-codegen-meta" name = "cranelift-codegen-meta"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "322e3ca0603683cc17f0c808559c0fb85ad52b0f20ace0478bdd4ba2fa1e9678" checksum = "903dc8915af62aad1d9d0f39a5968d33fa80b9aa899ed6f56e47f40ca4512e1e"
dependencies = [ dependencies = [
"cranelift-assembler-x64-meta", "cranelift-assembler-x64-meta",
"cranelift-codegen-shared", "cranelift-codegen-shared",
@@ -844,24 +844,24 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-codegen-shared" name = "cranelift-codegen-shared"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "287ab88211d049178dc8dda243e2db176919d8b29db605c0efc7c6d76ebea0f7" checksum = "0522d74c227e49f3fd49ab055311486ae4f09083262b66705bed676952491469"
[[package]] [[package]]
name = "cranelift-control" name = "cranelift-control"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c11438f9becf9a1e1e061bf76a33241b941a07ed01a489e9dad5fa79dc3624e9" checksum = "66560ea1c5cef72e170b18e46d263dba2d3169c9d39e8cafdab2173c6362cc1a"
dependencies = [ dependencies = [
"arbitrary", "arbitrary",
] ]
[[package]] [[package]]
name = "cranelift-entity" name = "cranelift-entity"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "584ecabe1462593a9cba9efbf9022e0987421ddb548989b455ab8bdd444b743c" checksum = "b62ef5b17cc814d27e96b66a5b46da0e4ce2b8ac55a6d478048bb99d04b05526"
dependencies = [ dependencies = [
"cranelift-bitset", "cranelift-bitset",
"serde", "serde",
@@ -871,9 +871,9 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-frontend" name = "cranelift-frontend"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34249873145213a12106d5fd8a98a9dc9e90e16525e2337b2907874d1e7e9ee7" checksum = "a87e0aaa39dbf70693b348a221e45904111704ee8f9fef140498471005f9842d"
dependencies = [ dependencies = [
"cranelift-codegen", "cranelift-codegen",
"hashbrown 0.17.1", "hashbrown 0.17.1",
@@ -884,15 +884,15 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-isle" name = "cranelift-isle"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6f1c1dc4d6b4bc4f0be12b08cee0e59f7610287827aa62590f8e9ec6f45dff4" checksum = "cf79003ebfa1eed5e87f3b84446ad5236f540268289960e14f387dc9b28e40b7"
[[package]] [[package]]
name = "cranelift-native" name = "cranelift-native"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31d9e4f6d9a3777b1ffa818000b4a6d7afd1b8787af71a9c58d94baef9076ced" checksum = "05bf4f235743c81e67ee4db617c5a4a0b65d58d3f0cfc575ee0f1a4e0cd58273"
dependencies = [ dependencies = [
"cranelift-codegen", "cranelift-codegen",
"libc", "libc",
@@ -901,9 +901,9 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-srcgen" name = "cranelift-srcgen"
version = "0.134.2" version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4155f8a1afdef96a0272c67804926eee4ef35f9708ab22ad6878d4c9543df596" checksum = "f6977c2a71ab1e0d1e62f966b411a498aa04c4dce47d93d52f8a360a06058922"
[[package]] [[package]]
name = "crc" name = "crc"
@@ -1237,6 +1237,12 @@ version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
[[package]]
name = "diff"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
[[package]] [[package]]
name = "digest" name = "digest"
version = "0.10.7" version = "0.10.7"
@@ -1284,13 +1290,13 @@ dependencies = [
[[package]] [[package]]
name = "displaydoc" name = "displaydoc"
version = "0.2.6" version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.119", "syn 3.0.3",
] ]
[[package]] [[package]]
@@ -1390,9 +1396,9 @@ dependencies = [
[[package]] [[package]]
name = "either" name = "either"
version = "1.16.0" version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d"
[[package]] [[package]]
name = "elliptic-curve" name = "elliptic-curve"
@@ -1527,9 +1533,9 @@ checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24"
[[package]] [[package]]
name = "find-msvc-tools" name = "find-msvc-tools"
version = "0.1.9" version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de"
[[package]] [[package]]
name = "flate2" name = "flate2"
@@ -1890,9 +1896,9 @@ dependencies = [
[[package]] [[package]]
name = "http" name = "http"
version = "1.4.2" version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0"
dependencies = [ dependencies = [
"bytes", "bytes",
"itoa", "itoa",
@@ -1941,9 +1947,9 @@ checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15"
[[package]] [[package]]
name = "hybrid-array" name = "hybrid-array"
version = "0.4.13" version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b"
dependencies = [ dependencies = [
"subtle", "subtle",
"typenum", "typenum",
@@ -2223,9 +2229,9 @@ checksum = "2f0fb0570afe1fed943c5c3d4102d5358592d8625fda6a0007fdbe65a92fba96"
[[package]] [[package]]
name = "ipnet" name = "ipnet"
version = "2.12.0" version = "2.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78"
[[package]] [[package]]
name = "itertools" name = "itertools"
@@ -2272,9 +2278,9 @@ dependencies = [
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.103" version = "0.3.104"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"futures-util", "futures-util",
@@ -2283,9 +2289,9 @@ dependencies = [
[[package]] [[package]]
name = "kqueue" name = "kqueue"
version = "1.2.0" version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" checksum = "8d763e5b24120b4ddf50de6c92308156765aabfbbccebf401da7cff2d70a41ea"
dependencies = [ dependencies = [
"kqueue-sys", "kqueue-sys",
"libc", "libc",
@@ -2337,9 +2343,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]] [[package]]
name = "libredox" name = "libredox"
version = "0.1.18" version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa"
dependencies = [ dependencies = [
"libc", "libc",
] ]
@@ -3046,9 +3052,9 @@ dependencies = [
[[package]] [[package]]
name = "portable-atomic" name = "portable-atomic"
version = "1.14.0" version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85"
[[package]] [[package]]
name = "postcard" name = "postcard"
@@ -3086,6 +3092,16 @@ dependencies = [
"zerocopy", "zerocopy",
] ]
[[package]]
name = "pretty_assertions"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d"
dependencies = [
"diff",
"yansi",
]
[[package]] [[package]]
name = "prettyplease" name = "prettyplease"
version = "0.2.37" version = "0.2.37"
@@ -3216,9 +3232,9 @@ dependencies = [
[[package]] [[package]]
name = "pulley-interpreter" name = "pulley-interpreter"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6064e52588328c1275d690baad99f8d4b3fdd870736966f1a63cfcbb20560b6" checksum = "bc5c8c21ea032e4efbdf2d067dc45171779dbe0c8ecf20ef4a57efa7474f2b0a"
dependencies = [ dependencies = [
"cranelift-bitset", "cranelift-bitset",
"log", "log",
@@ -3228,9 +3244,9 @@ dependencies = [
[[package]] [[package]]
name = "pulley-macros" name = "pulley-macros"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e832980317bfc7f8c8538ffc9c69b82912f3e33ec70f7c855d521654c70fa62" checksum = "9f10925455d5dde962e3604eade797ba5488644c8ee14a44191e2f2b58980574"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -3285,7 +3301,7 @@ dependencies = [
"sha2 0.11.0", "sha2 0.11.0",
"sysinfo", "sysinfo",
"tempfile", "tempfile",
"thiserror 2.0.19", "thiserror 2.0.20",
"time", "time",
"tokio", "tokio",
"tokio-util", "tokio-util",
@@ -3320,13 +3336,34 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "pumpkin-codegen"
version = "0.1.0-dev+26.1"
dependencies = [
"heck",
"indexmap",
"md5",
"proc-macro2",
"pumpkin-nbt",
"pumpkin-util",
"quote",
"rayon",
"semver",
"serde",
"serde_json",
"serde_json5",
"serde_repr",
"syn 3.0.3",
"wit-encoder",
]
[[package]] [[package]]
name = "pumpkin-config" name = "pumpkin-config"
version = "0.1.0-dev+26.2-26.40" version = "0.1.0-dev+26.2-26.40"
dependencies = [ dependencies = [
"pumpkin-util", "pumpkin-util",
"serde", "serde",
"toml 1.1.3+spec-1.1.0", "toml 1.1.4+spec-1.1.0",
"tracing", "tracing",
"uuid", "uuid",
] ]
@@ -3353,7 +3390,7 @@ dependencies = [
"pumpkin-util", "pumpkin-util",
"pumpkin-world", "pumpkin-world",
"rand 0.10.2", "rand 0.10.2",
"thiserror 2.0.19", "thiserror 2.0.20",
"tokio", "tokio",
"tracing", "tracing",
] ]
@@ -3364,6 +3401,7 @@ version = "0.1.0-dev+26.2-26.40"
dependencies = [ dependencies = [
"heck", "heck",
"proc-macro-error2", "proc-macro-error2",
"proc-macro2",
"pumpkin-data", "pumpkin-data",
"quote", "quote",
"syn 3.0.3", "syn 3.0.3",
@@ -3379,7 +3417,7 @@ dependencies = [
"flate2", "flate2",
"pumpkin-codecs", "pumpkin-codecs",
"tempfile", "tempfile",
"thiserror 2.0.19", "thiserror 2.0.20",
"tracing", "tracing",
"uuid", "uuid",
] ]
@@ -3399,7 +3437,7 @@ dependencies = [
name = "pumpkin-protocol" name = "pumpkin-protocol"
version = "0.1.0-dev+26.2-26.40" version = "0.1.0-dev+26.2-26.40"
dependencies = [ dependencies = [
"aes 0.9.1", "aes 0.9.2",
"async-compression", "async-compression",
"bitflags 2.13.1", "bitflags 2.13.1",
"bytes", "bytes",
@@ -3412,7 +3450,7 @@ dependencies = [
"pumpkin-util", "pumpkin-util",
"pumpkin-world", "pumpkin-world",
"serde", "serde",
"thiserror 2.0.19", "thiserror 2.0.20",
"tokio", "tokio",
"uuid", "uuid",
] ]
@@ -3440,7 +3478,7 @@ dependencies = [
"serde_json", "serde_json",
"sha2 0.11.0", "sha2 0.11.0",
"syn 3.0.3", "syn 3.0.3",
"thiserror 2.0.19", "thiserror 2.0.20",
"tokio", "tokio",
"ureq", "ureq",
"uuid", "uuid",
@@ -3475,7 +3513,7 @@ dependencies = [
"sha2 0.11.0", "sha2 0.11.0",
"slotmap", "slotmap",
"tempfile", "tempfile",
"thiserror 2.0.19", "thiserror 2.0.20",
"tokio", "tokio",
"tokio-util", "tokio-util",
"tracing", "tracing",
@@ -3657,9 +3695,9 @@ dependencies = [
[[package]] [[package]]
name = "regex-automata" name = "regex-automata"
version = "0.4.16" version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@@ -3854,9 +3892,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls" name = "rustls"
version = "0.23.42" version = "0.23.43"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06"
dependencies = [ dependencies = [
"log", "log",
"once_cell", "once_cell",
@@ -4019,6 +4057,7 @@ version = "1.0.151"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
dependencies = [ dependencies = [
"indexmap",
"itoa", "itoa",
"memchr", "memchr",
"serde", "serde",
@@ -4399,11 +4438,11 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "2.0.19" version = "2.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f"
dependencies = [ dependencies = [
"thiserror-impl 2.0.19", "thiserror-impl 2.0.20",
] ]
[[package]] [[package]]
@@ -4419,9 +4458,9 @@ dependencies = [
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "2.0.19" version = "2.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -4439,9 +4478,9 @@ dependencies = [
[[package]] [[package]]
name = "time" name = "time"
version = "0.3.54" version = "0.3.55"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134"
dependencies = [ dependencies = [
"deranged", "deranged",
"libc", "libc",
@@ -4586,9 +4625,9 @@ dependencies = [
[[package]] [[package]]
name = "toml" name = "toml"
version = "1.1.3+spec-1.1.0" version = "1.1.4+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c" checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5"
dependencies = [ dependencies = [
"serde_core", "serde_core",
"serde_spanned", "serde_spanned",
@@ -4618,9 +4657,9 @@ dependencies = [
[[package]] [[package]]
name = "toml_parser" name = "toml_parser"
version = "1.1.2+spec-1.1.0" version = "1.1.3+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56"
dependencies = [ dependencies = [
"winnow 1.0.4", "winnow 1.0.4",
] ]
@@ -4854,11 +4893,11 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]] [[package]]
name = "ureq" name = "ureq"
version = "3.3.0" version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" checksum = "972d7902c8735f2695410b8aed7df6ed12a47394aa1c8d7af49f0497b731a94d"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.23.1",
"cookie_store", "cookie_store",
"log", "log",
"percent-encoding", "percent-encoding",
@@ -4873,11 +4912,11 @@ dependencies = [
[[package]] [[package]]
name = "ureq-proto" name = "ureq-proto"
version = "0.6.0" version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" checksum = "da5f78b09e6941e1a0f2e30e695e4b120377b54d5e0aec11b594bb57b3971613"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.23.1",
"http", "http",
"httparse", "httparse",
"log", "log",
@@ -4983,9 +5022,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.126" version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"once_cell", "once_cell",
@@ -4996,9 +5035,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.126" version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1"
dependencies = [ dependencies = [
"quote", "quote",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@@ -5006,9 +5045,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.126" version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"proc-macro2", "proc-macro2",
@@ -5019,9 +5058,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.126" version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@@ -5119,9 +5158,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime" name = "wasmtime"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06d9f263ccb212017dae1d109b9997f218a7675db1e9a7bedf07ae1643322bf3" checksum = "c80ca6098e0d4d06886d91d7f2cc3cb6623eb583c4c0ab3c89cbfb6098c8586c"
dependencies = [ dependencies = [
"addr2line", "addr2line",
"async-trait", "async-trait",
@@ -5162,9 +5201,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-environ" name = "wasmtime-environ"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9915e3d90c36a16e0fec8be746ee87e21cf0d4a017ecf09c49b7d1cc6f31b2b6" checksum = "134f9d136d29c76f6c1b4c9b468e97a2efc38c7d49fd188e39b64870b2fea701"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cpp_demangle", "cpp_demangle",
@@ -5193,9 +5232,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-internal-cache" name = "wasmtime-internal-cache"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b7c25436e1602aad2de80bfb3f586dcdfb6fe426d5b17cba37fabf9a1714d32" checksum = "65db2eb1bfc5371a3b4107dbf539d0b93d05016fc29625b1648146b47db02071"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"directories-next", "directories-next",
@@ -5213,9 +5252,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-internal-component-macro" name = "wasmtime-internal-component-macro"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b627ea698db36fb9110aa77868467f1d23791a76a88a433cb6a43e1242073b77" checksum = "2bf7b91fed3fc34781d57f9c6654ea2513bf0a99f7b0b0523c00de1e6efebe1c"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"proc-macro2", "proc-macro2",
@@ -5228,15 +5267,15 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-internal-component-util" name = "wasmtime-internal-component-util"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f45bf943cff1d2f1976bac6a241ca4ecaf29a6efd5f1ad89e7722439fa5c392f" checksum = "fc8a678149885cae00289f806fbe74c7863084cf74cace0b8dc73602279400e1"
[[package]] [[package]]
name = "wasmtime-internal-core" name = "wasmtime-internal-core"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea33e1f9685be82f90223bebcf2ffefb6b596ea3d82a3c42384527b9c6f5b447" checksum = "8a0092c4b9d070ac5e278b6d0db10f5e71214190f0347ca57502b4692f796321"
dependencies = [ dependencies = [
"hashbrown 0.17.1", "hashbrown 0.17.1",
"libm", "libm",
@@ -5245,9 +5284,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-internal-cranelift" name = "wasmtime-internal-cranelift"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b1ce104719932a48dbdfec0cc292c96494b0bfe764946e45fbfd3340e3a68f9" checksum = "6851ebc9e03cab23d9821d2b2505d380bdfe38f35ccec945247b05274d85c98b"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"cranelift-codegen", "cranelift-codegen",
@@ -5262,7 +5301,7 @@ dependencies = [
"pulley-interpreter", "pulley-interpreter",
"smallvec", "smallvec",
"target-lexicon", "target-lexicon",
"thiserror 2.0.19", "thiserror 2.0.20",
"wasmparser 0.252.0", "wasmparser 0.252.0",
"wasmtime-environ", "wasmtime-environ",
"wasmtime-internal-core", "wasmtime-internal-core",
@@ -5272,9 +5311,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-internal-fiber" name = "wasmtime-internal-fiber"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976e4b71b9c0da8a9a7bb8d5fa0abedc4da879b397111fd91ece73be524fe621" checksum = "9b26da6d5f60d4c438da70bba3553fe810a840533a64156be287dca2081c6991"
dependencies = [ dependencies = [
"cc", "cc",
"cfg-if", "cfg-if",
@@ -5287,9 +5326,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-internal-jit-debug" name = "wasmtime-internal-jit-debug"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1f60ecba3497cfc26284903c2e79023fd5ea991b95b0e8dafe994fd9fca4c4e" checksum = "ed621ba25d7bf78b7edd7b4749abbb27c2e5cdba836c9504a424ee74b6c23149"
dependencies = [ dependencies = [
"cc", "cc",
"wasmtime-internal-versioned-export-macros", "wasmtime-internal-versioned-export-macros",
@@ -5297,9 +5336,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-internal-jit-icache-coherence" name = "wasmtime-internal-jit-icache-coherence"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fae6decb025ae6d12f3391b36deb62a6838d45b18864f796d84bced722ceac0d" checksum = "5684ba160951baad06a725696f3c590e2fb0e8067c2aebee27bf7f9259058e85"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
@@ -5309,9 +5348,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-internal-unwinder" name = "wasmtime-internal-unwinder"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0982122d9470d3d72ed7aa9ed91e69538ae44c1494cd22d78fec7846b248a940" checksum = "112eead527bffa8ff0646a11fb4339a9d52ddd1da2b9a6fce4aff84c815dd94f"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"cranelift-codegen", "cranelift-codegen",
@@ -5322,9 +5361,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-internal-versioned-export-macros" name = "wasmtime-internal-versioned-export-macros"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "363cf88a80e6ed13311d0d34d9bcd02a2e07d98113b994ff41ed386a206f498e" checksum = "153592e0bed824fc13c6696203fa1bd7bd20eb355316475e39a55f081ef80eca"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -5333,9 +5372,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-internal-wit-bindgen" name = "wasmtime-internal-wit-bindgen"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87ff41bb1656cbeb7befc42b8a7078b30a5f8393a0c8bca36a6cec94360c1a16" checksum = "c456ad6e81e0f46abfeca43687d18ea15e289c395b262ea6e0023e2682e088be"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bitflags 2.13.1", "bitflags 2.13.1",
@@ -5346,9 +5385,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-wasi" name = "wasmtime-wasi"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed1750b8e5e5d5b1ee3c0eb602d2c49d6a37a36e9996eaf0708b48ac92b62b06" checksum = "4c1cf60cd6a565213af7074b4aad7bb5e110e3c6c6aae54425aa0500a0e15e86"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"bitflags 2.13.1", "bitflags 2.13.1",
@@ -5360,7 +5399,7 @@ dependencies = [
"io-lifetimes 3.0.1", "io-lifetimes 3.0.1",
"rand 0.10.2", "rand 0.10.2",
"rustix", "rustix",
"thiserror 2.0.19", "thiserror 2.0.20",
"tokio", "tokio",
"tracing", "tracing",
"url", "url",
@@ -5371,9 +5410,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-wasi-http" name = "wasmtime-wasi-http"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "014b8f05cacb7a5d665536e8a733b887bd192a9c179037580d48d0a6a82ecd34" checksum = "a499879061ee9f724342d5f5009754b723ae53c7932161ee063a9fe19395e915"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"bytes", "bytes",
@@ -5394,9 +5433,9 @@ dependencies = [
[[package]] [[package]]
name = "wasmtime-wasi-io" name = "wasmtime-wasi-io"
version = "47.0.2" version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54777d3afeaf3f32cc444df661d9cb4fd57067971e183c2b1f5251f33b939e68" checksum = "7fb08e1d7755aaa467ce14080b7b01e33c914a920f6000696f1e42e40ea6387e"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"bytes", "bytes",
@@ -5987,6 +6026,19 @@ dependencies = [
"wit-parser 0.254.0", "wit-parser 0.254.0",
] ]
[[package]]
name = "wit-encoder"
version = "0.255.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cebd2d14c3296dada506c67c1ee5c9440811a2fe88a83367a606ccbd30ebfde"
dependencies = [
"id-arena",
"pretty_assertions",
"semver",
"serde",
"wit-parser 0.255.0",
]
[[package]] [[package]]
name = "wit-parser" name = "wit-parser"
version = "0.252.0" version = "0.252.0"
@@ -6025,6 +6077,25 @@ dependencies = [
"wasmparser 0.254.0", "wasmparser 0.254.0",
] ]
[[package]]
name = "wit-parser"
version = "0.255.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5f6371fc71f15730b756c1dea3562a67adab1a7e519c4ca010173d883695bb"
dependencies = [
"anyhow",
"hashbrown 0.17.1",
"id-arena",
"indexmap",
"log",
"semver",
"serde",
"serde_derive",
"serde_json",
"unicode-ident",
"wasmparser 0.255.0",
]
[[package]] [[package]]
name = "wnaf" name = "wnaf"
version = "0.14.0" version = "0.14.0"
@@ -6078,6 +6149,12 @@ version = "0.8.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6" checksum = "aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6"
[[package]]
name = "yansi"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
[[package]] [[package]]
name = "yasna" name = "yasna"
version = "0.5.2" version = "0.5.2"
@@ -6112,18 +6189,18 @@ dependencies = [
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.8.55" version = "0.8.56"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb"
dependencies = [ dependencies = [
"zerocopy-derive", "zerocopy-derive",
] ]
[[package]] [[package]]
name = "zerocopy-derive" name = "zerocopy-derive"
version = "0.8.55" version = "0.8.56"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View File

@@ -13,8 +13,8 @@ members = [
"crates/pumpkin-protocol", "crates/pumpkin-protocol",
"crates/pumpkin-util", "crates/pumpkin-util",
"crates/pumpkin-world", "crates/pumpkin-world",
"tools/pumpkin-codegen",
] ]
exclude = ["tools/pumpkin-codegen"]
# [workspace.lints.rust] # [workspace.lints.rust]
# missing_docs = "warn" # missing_docs = "warn"
@@ -204,7 +204,7 @@ time = { version = "0.3", default-features = false, features = ["std"] }
arc-swap = { version = "1.9", default-features = false } arc-swap = { version = "1.9", default-features = false }
tokio-util = { version = "0.7.19", default-features = false } tokio-util = { version = "0.7.19", default-features = false }
toml = { version = "1.1", default-features = false, features = ["parse", "display", "serde"] } toml = { version = "1.1", default-features = false, features = ["parse", "display", "serde"] }
ureq = { version = "3.3.0", default-features = false, features = ["rustls"] } ureq = { version = "3.4.0", default-features = false, features = ["rustls"] }
notify = { version = "8.2.0", default-features = false, features = ["macos_fsevent"] } notify = { version = "8.2.0", default-features = false, features = ["macos_fsevent"] }
sysinfo = { version = "0.39", default-features = false, features = ["system"] } sysinfo = { version = "0.39", default-features = false, features = ["system"] }

File diff suppressed because it is too large Load Diff

View File

@@ -28,10 +28,12 @@ pub struct AdvancementDisplay {
} }
impl AdvancementDisplay { impl AdvancementDisplay {
#[allow(deprecated)]
pub fn get_title(&self) -> TextComponent { pub fn get_title(&self) -> TextComponent {
TextComponent::translate(self.title, []) TextComponent::translate(self.title, [])
} }
#[allow(deprecated)]
pub fn get_description(&self) -> TextComponent { pub fn get_description(&self) -> TextComponent {
TextComponent::translate(self.description, []) TextComponent::translate(self.description, [])
} }

View File

@@ -1111,6 +1111,7 @@ impl Enchantment {
} }
true true
} }
#[allow(deprecated)]
pub fn get_fullname(&self, level: i32) -> TextComponent { pub fn get_fullname(&self, level: i32) -> TextComponent {
let mut ret = TextComponent::translate(self.description, []).color_named( let mut ret = TextComponent::translate(self.description, []).color_named(
if self.has_tag(&EnchantmentTag::MINECRAFT_CURSE) { if self.has_tag(&EnchantmentTag::MINECRAFT_CURSE) {

View File

@@ -64250,6 +64250,7 @@ impl Item {
} }
}) })
.unwrap_or(self.registry_key); .unwrap_or(self.registry_key);
#[allow(deprecated)]
TextComponent::translate(name, &[]) TextComponent::translate(name, &[])
} }
#[doc = "Try to parse an item from a resource location string."] #[doc = "Try to parse an item from a resource location string."]

File diff suppressed because one or more lines are too long

View File

@@ -10,9 +10,10 @@ proc-macro = true
[dependencies] [dependencies]
proc-macro-error2.workspace = true proc-macro-error2.workspace = true
pumpkin-data = { workspace = true, features = ["block", "tag"] } pumpkin-data = { workspace = true, features = ["block", "tag", "translation"] }
heck.workspace = true heck.workspace = true
proc-macro2 = "1.0"
quote.workspace = true quote.workspace = true
syn.workspace = true syn.workspace = true

View File

@@ -626,3 +626,215 @@ fn is_vec(ty: &Type) -> bool {
false false
} }
} }
struct TranslateCrossInput {
java_expr: syn::Expr,
bedrock_expr: syn::Expr,
args: Vec<syn::Expr>,
}
impl syn::parse::Parse for TranslateCrossInput {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let java_expr: syn::Expr = input.parse()?;
let _ = input.parse::<syn::Token![,]>()?;
let bedrock_expr: syn::Expr = input.parse()?;
let mut args = Vec::new();
while !input.is_empty() {
let _ = input.parse::<syn::Token![,]>()?;
if input.is_empty() {
break;
}
args.push(input.parse()?);
}
Ok(Self {
java_expr,
bedrock_expr,
args,
})
}
}
fn eval_translation_key_expr(expr: &syn::Expr) -> Option<(&'static str, proc_macro2::Span)> {
match expr {
syn::Expr::Path(expr_path) => {
let segments: Vec<String> = expr_path
.path
.segments
.iter()
.map(|s| s.ident.to_string())
.collect();
let seg_refs: Vec<&str> = segments.iter().map(String::as_str).collect();
let (is_java, const_ident) = match seg_refs.as_slice() {
["translation", "java", ident]
| ["pumpkin_data" | "crate", "translation", "java", ident] => (true, *ident),
["translation", "bedrock", ident]
| ["pumpkin_data" | "crate", "translation", "bedrock", ident] => (false, *ident),
_ => return None,
};
let key = if is_java {
pumpkin_data::translation::java::get(const_ident)
.and_then(pumpkin_data::translation::java::get_value)
} else {
pumpkin_data::translation::bedrock::get(const_ident)
.and_then(pumpkin_data::translation::bedrock::get_value)
};
key.map(|k| (k, expr.span()))
}
syn::Expr::Lit(syn::ExprLit {
lit: syn::Lit::Str(lit_str),
..
}) => {
// Leaking string slice here is fine since this runs during compilation inside proc macro
let s = Box::leak(lit_str.value().into_boxed_str());
Some((s, lit_str.span()))
}
_ => None,
}
}
fn count_placeholders(format_str: &str) -> usize {
let mut count = 0;
let bytes = format_str.as_bytes();
let mut i = 0;
while i < bytes.len() {
if bytes[i] == b'%' && i + 1 < bytes.len() {
if bytes[i + 1] == b'%' {
i += 2;
continue;
}
// Handle positional specifiers like %1$s, %2$d
let mut j = i + 1;
while j < bytes.len() && bytes[j].is_ascii_digit() {
j += 1;
}
if j < bytes.len() && bytes[j] == b'$' {
count += 1;
i = j + 2; // skip past specifier character following $ (e.g., $s)
continue;
}
// Handle optional width/flags before specifier type like %s, %d, %f, %1s
count += 1;
i = j + 1; // skip past specifier character
continue;
}
i += 1;
}
count
}
/// Validates translation keys and arguments at compile-time and returns a `TextComponent`.
#[proc_macro]
pub fn translate_cross(input: TokenStream) -> TokenStream {
let TranslateCrossInput {
java_expr,
bedrock_expr,
args,
} = parse_macro_input!(input as TranslateCrossInput);
if let Some((java_str, span)) = eval_translation_key_expr(&java_expr) {
let expected = count_placeholders(java_str);
// Java translation keys from generated constants might differ from Bedrock key placeholder formats
if expected != args.len() && matches!(java_expr, syn::Expr::Lit(_)) {
return syn::Error::new(
span,
format!(
"Java translation key `{}` expects {} argument(s), but {} were provided",
java_str,
expected,
args.len()
),
)
.to_compile_error()
.into();
}
}
if let Some((bedrock_str, span)) = eval_translation_key_expr(&bedrock_expr) {
let expected = count_placeholders(bedrock_str);
if expected != args.len() && matches!(bedrock_expr, syn::Expr::Lit(_)) {
return syn::Error::new(
span,
format!(
"Bedrock translation key `{}` expects {} argument(s), but {} were provided",
bedrock_str,
expected,
args.len()
),
)
.to_compile_error()
.into();
}
}
let expanded = quote! {
{
#[allow(deprecated)]
pumpkin_util::text::TextComponent::translate_cross(#java_expr, #bedrock_expr, vec![#(#args),*])
}
};
expanded.into()
}
struct TranslateJavaInput {
java_expr: syn::Expr,
args: Vec<syn::Expr>,
}
impl syn::parse::Parse for TranslateJavaInput {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let java_expr: syn::Expr = input.parse()?;
let mut args = Vec::new();
while !input.is_empty() {
let _ = input.parse::<syn::Token![,]>()?;
if input.is_empty() {
break;
}
args.push(input.parse()?);
}
Ok(Self { java_expr, args })
}
}
/// Validates Java translation keys and arguments at compile-time and returns a `TextComponent`.
#[deprecated(
since = "0.1.0",
note = "Use `pumpkin_macros::translate_cross!` macro instead for cross-platform (Java & Bedrock) translation support."
)]
#[proc_macro]
pub fn translate_java(input: TokenStream) -> TokenStream {
let TranslateJavaInput { java_expr, args } = parse_macro_input!(input as TranslateJavaInput);
if let Some((java_str, span)) = eval_translation_key_expr(&java_expr) {
let expected = count_placeholders(java_str);
if expected != args.len() {
return syn::Error::new(
span,
format!(
"Java translation key `{}` expects {} argument(s), but {} were provided",
java_str,
expected,
args.len()
),
)
.to_compile_error()
.into();
}
}
let expanded = quote! {
{
#[allow(deprecated)]
pumpkin_util::text::TextComponent::translate(#java_expr, vec![#(#args),*])
}
};
expanded.into()
}

View File

@@ -663,6 +663,10 @@ impl TextComponent {
/// ///
/// # Returns /// # Returns
/// A new `TextComponent` that will be translated on the client. /// A new `TextComponent` that will be translated on the client.
#[deprecated(
since = "0.1.0",
note = "Use the `pumpkin_macros::translate_java!` macro instead for compile-time translation key and parameter checking."
)]
#[must_use] #[must_use]
pub fn translate<K: Into<Cow<'static, str>>, W: Into<Vec<Self>>>(key: K, with: W) -> Self { pub fn translate<K: Into<Cow<'static, str>>, W: Into<Vec<Self>>>(key: K, with: W) -> Self {
Self(TextComponentBase { Self(TextComponentBase {
@@ -685,6 +689,10 @@ impl TextComponent {
/// ///
/// # Returns /// # Returns
/// A new `TextComponent` that will be translated natively on both clients. /// A new `TextComponent` that will be translated natively on both clients.
#[deprecated(
since = "0.1.0",
note = "Use the `pumpkin_macros::translate_cross!` macro instead for compile-time translation key and parameter checking."
)]
#[must_use] #[must_use]
pub fn translate_cross< pub fn translate_cross<
K1: Into<Cow<'static, str>>, K1: Into<Cow<'static, str>>,
@@ -1023,6 +1031,7 @@ impl TextComponent {
/// ///
/// # Returns /// # Returns
/// The new component. /// The new component.
#[allow(deprecated)]
#[must_use] #[must_use]
pub fn wrap_in_square_brackets(self) -> Self { pub fn wrap_in_square_brackets(self) -> Self {
Self::translate("chat.square_brackets", [self]) Self::translate("chat.square_brackets", [self])
@@ -1277,6 +1286,7 @@ mod test {
#[test] #[test]
fn serialize_text_component() { fn serialize_text_component() {
#[allow(deprecated)]
let msg_comp = TextComponent::translate( let msg_comp = TextComponent::translate(
"multiplayer.player.joined", "multiplayer.player.joined",
[TextComponent::text("NAME".to_string())], [TextComponent::text("NAME".to_string())],

View File

@@ -5,6 +5,7 @@ description = "Empowering everyone to host fast and efficient Minecraft servers.
edition.workspace = true edition.workspace = true
rust-version.workspace = true rust-version.workspace = true
license.workspace = true license.workspace = true
default-run = "pumpkin"
[package.metadata.tauri-winres] [package.metadata.tauri-winres]
# FileDescription is handled as the Program name by Windows! # FileDescription is handled as the Program name by Windows!

View File

@@ -97,10 +97,9 @@ impl ScreenHandlerFactory for AnvilScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_REPAIR, translation::java::CONTAINER_REPAIR,
translation::bedrock::CONTAINER_REPAIR, translation::bedrock::CONTAINER_REPAIR
&[],
) )
} }
} }

View File

@@ -39,10 +39,9 @@ impl ScreenHandlerFactory for BarrelScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_BARREL, translation::java::CONTAINER_BARREL,
translation::bedrock::CONTAINER_BARREL, translation::bedrock::CONTAINER_BARREL
&[],
) )
} }
} }

View File

@@ -37,10 +37,9 @@ impl ScreenHandlerFactory for BeaconScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_BEACON, translation::java::CONTAINER_BEACON,
translation::bedrock::CONTAINER_BEACON, translation::bedrock::CONTAINER_BEACON
&[],
) )
} }
} }

View File

@@ -11,7 +11,6 @@ use pumpkin_data::translation;
use pumpkin_macros::pumpkin_block_from_tag; use pumpkin_macros::pumpkin_block_from_tag;
use pumpkin_util::GameMode; use pumpkin_util::GameMode;
use pumpkin_util::math::position::BlockPos; use pumpkin_util::math::position::BlockPos;
use pumpkin_util::text::TextComponent;
use pumpkin_world::world::BlockFlags; use pumpkin_world::world::BlockFlags;
use crate::block::BlockFuture; use crate::block::BlockFuture;
@@ -247,10 +246,9 @@ impl BlockBehaviour for BedBlock {
{ {
args.player args.player
.send_system_message_raw( .send_system_message_raw(
&TextComponent::translate_cross( &pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_OBSTRUCTED, translation::java::BLOCK_MINECRAFT_BED_OBSTRUCTED,
translation::java::BLOCK_MINECRAFT_BED_OBSTRUCTED, translation::bedrock::TILE_BED_OBSTRUCTED
[],
), ),
true, true,
) )
@@ -264,10 +262,9 @@ impl BlockBehaviour for BedBlock {
args.player args.player
.send_system_message_raw( .send_system_message_raw(
&TextComponent::translate_cross( &pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_OCCUPIED, translation::java::BLOCK_MINECRAFT_BED_OCCUPIED,
translation::bedrock::TILE_BED_OCCUPIED, translation::bedrock::TILE_BED_OCCUPIED
[],
), ),
true, true,
) )
@@ -287,10 +284,9 @@ impl BlockBehaviour for BedBlock {
{ {
args.player args.player
.send_system_message_raw( .send_system_message_raw(
&TextComponent::translate_cross( &pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_TOO_FAR_AWAY, translation::java::BLOCK_MINECRAFT_BED_TOO_FAR_AWAY,
translation::java::BLOCK_MINECRAFT_BED_TOO_FAR_AWAY, translation::bedrock::TILE_BED_TOOFAR
[],
), ),
true, true,
) )
@@ -311,10 +307,9 @@ impl BlockBehaviour for BedBlock {
.await .await
{ {
args.player args.player
.send_system_message(&TextComponent::translate_cross( .send_system_message(&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_SET_SPAWN, translation::java::BLOCK_MINECRAFT_SET_SPAWN,
translation::bedrock::TILE_BED_RESPAWNSET, translation::bedrock::TILE_BED_RESPAWNSET
[],
)) ))
.await; .await;
} }
@@ -323,10 +318,9 @@ impl BlockBehaviour for BedBlock {
if !can_sleep(args.world).await { if !can_sleep(args.world).await {
args.player args.player
.send_system_message_raw( .send_system_message_raw(
&TextComponent::translate_cross( &pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_NO_SLEEP, translation::java::BLOCK_MINECRAFT_BED_NO_SLEEP,
translation::java::BLOCK_MINECRAFT_BED_NO_SLEEP, translation::bedrock::TILE_BED_NOSLEEP
[],
), ),
true, true,
) )
@@ -346,10 +340,9 @@ impl BlockBehaviour for BedBlock {
{ {
args.player args.player
.send_system_message_raw( .send_system_message_raw(
&TextComponent::translate_cross( &pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_NOT_SAFE, translation::java::BLOCK_MINECRAFT_BED_NOT_SAFE,
translation::java::BLOCK_MINECRAFT_BED_NOT_SAFE, translation::bedrock::TILE_BED_NOTSAFE
[],
), ),
true, true,
) )

View File

@@ -16,7 +16,6 @@ use pumpkin_inventory::{
screen_handler::{BoxFuture, InventoryPlayer, ScreenHandlerFactory, SharedScreenHandler}, screen_handler::{BoxFuture, InventoryPlayer, ScreenHandlerFactory, SharedScreenHandler},
}; };
use pumpkin_macros::pumpkin_block; use pumpkin_macros::pumpkin_block;
use pumpkin_util::text::TextComponent;
use pumpkin_world::inventory::Inventory; use pumpkin_world::inventory::Inventory;
use tokio::sync::Mutex; use tokio::sync::Mutex;
@@ -73,10 +72,9 @@ impl ScreenHandlerFactory for BlastingFurnaceScreenFactory {
} }
fn get_display_name(&self) -> pumpkin_util::text::TextComponent { fn get_display_name(&self) -> pumpkin_util::text::TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_BLAST_FURNACE, translation::java::CONTAINER_BLAST_FURNACE,
translation::bedrock::TILE_BLAST_FURNACE_NAME, translation::bedrock::TILE_BLAST_FURNACE_NAME
&[],
) )
} }
} }

View File

@@ -38,10 +38,9 @@ impl ScreenHandlerFactory for BrewingScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_BREWING, translation::java::CONTAINER_BREWING,
translation::bedrock::CONTAINER_BREWING, translation::bedrock::CONTAINER_BREWING
&[],
) )
} }
} }

View File

@@ -59,16 +59,14 @@ impl ScreenHandlerFactory for ChestScreenFactory {
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
if self.0.size() > 27 { if self.0.size() > 27 {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_CHESTDOUBLE, translation::java::CONTAINER_CHESTDOUBLE,
translation::bedrock::CONTAINER_CHESTDOUBLE, translation::bedrock::CONTAINER_CHESTDOUBLE
&[],
) )
} else { } else {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_CHEST, translation::java::CONTAINER_CHEST,
translation::bedrock::CONTAINER_CHEST, translation::bedrock::CONTAINER_CHEST
&[],
) )
} }
} }

View File

@@ -57,10 +57,9 @@ impl ScreenHandlerFactory for CraftingTableScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_CRAFTING, translation::java::CONTAINER_CRAFTING,
translation::bedrock::CONTAINER_CRAFTING, translation::bedrock::CONTAINER_CRAFTING
&[],
) )
} }
} }

View File

@@ -121,10 +121,9 @@ impl ScreenHandlerFactory for EnchantingTableScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_ENCHANT, translation::java::CONTAINER_ENCHANT,
translation::bedrock::CONTAINER_ENCHANT, translation::bedrock::CONTAINER_ENCHANT
&[],
) )
} }
} }

View File

@@ -38,10 +38,9 @@ impl ScreenHandlerFactory for EnderChestScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_ENDERCHEST, translation::java::CONTAINER_ENDERCHEST,
translation::bedrock::CONTAINER_ENDERCHEST, translation::bedrock::CONTAINER_ENDERCHEST
&[],
) )
} }
} }

View File

@@ -15,7 +15,6 @@ use pumpkin_inventory::{
screen_handler::{BoxFuture, InventoryPlayer, ScreenHandlerFactory, SharedScreenHandler}, screen_handler::{BoxFuture, InventoryPlayer, ScreenHandlerFactory, SharedScreenHandler},
}; };
use pumpkin_macros::pumpkin_block; use pumpkin_macros::pumpkin_block;
use pumpkin_util::text::TextComponent;
use pumpkin_world::inventory::Inventory; use pumpkin_world::inventory::Inventory;
use tokio::sync::Mutex; use tokio::sync::Mutex;
@@ -72,10 +71,9 @@ impl ScreenHandlerFactory for FurnaceScreenFactory {
} }
fn get_display_name(&self) -> pumpkin_util::text::TextComponent { fn get_display_name(&self) -> pumpkin_util::text::TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_FURNACE, translation::java::CONTAINER_FURNACE,
translation::bedrock::CONTAINER_FURNACE, translation::bedrock::CONTAINER_FURNACE
&[],
) )
} }
} }

View File

@@ -45,10 +45,9 @@ impl ScreenHandlerFactory for HopperBlockScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_HOPPER, translation::java::CONTAINER_HOPPER,
translation::bedrock::CONTAINER_HOPPER, translation::bedrock::CONTAINER_HOPPER
&[],
) )
} }
} }

View File

@@ -97,10 +97,9 @@ impl ScreenHandlerFactory for LecternScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_LECTERN, translation::java::CONTAINER_LECTERN,
translation::bedrock::TILE_LECTERN_NAME, translation::bedrock::TILE_LECTERN_NAME
&[],
) )
} }
} }

View File

@@ -44,10 +44,9 @@ impl ScreenHandlerFactory for CrafterScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_CRAFTER, translation::java::CONTAINER_CRAFTER,
translation::bedrock::CONTAINER_CRAFTER, translation::bedrock::CONTAINER_CRAFTER
&[],
) )
} }
} }

View File

@@ -64,10 +64,9 @@ impl ScreenHandlerFactory for DispenserScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_DISPENSER, translation::java::CONTAINER_DISPENSER,
translation::bedrock::CONTAINER_DISPENSER, translation::bedrock::CONTAINER_DISPENSER
&[],
) )
} }
} }

View File

@@ -48,10 +48,9 @@ impl ScreenHandlerFactory for DropperScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_DROPPER, translation::java::CONTAINER_DROPPER,
translation::bedrock::CONTAINER_DROPPER, translation::bedrock::CONTAINER_DROPPER
&[],
) )
} }
} }

View File

@@ -4,7 +4,6 @@ use pumpkin_data::item::Item;
use pumpkin_data::sound::{Sound, SoundCategory}; use pumpkin_data::sound::{Sound, SoundCategory};
use pumpkin_data::translation; use pumpkin_data::translation;
use pumpkin_macros::pumpkin_block; use pumpkin_macros::pumpkin_block;
use pumpkin_util::text::TextComponent;
use pumpkin_world::world::BlockFlags; use pumpkin_world::world::BlockFlags;
use crate::block::registry::BlockActionResult; use crate::block::registry::BlockActionResult;
@@ -70,9 +69,9 @@ impl BlockBehaviour for RespawnAnchorBlock {
if props.charges == 0 { if props.charges == 0 {
args.player args.player
.send_system_message(&TextComponent::translate( .send_system_message(&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_NO_SLEEP, translation::java::BLOCK_MINECRAFT_BED_NO_SLEEP,
&[], translation::bedrock::TILE_BED_NOSLEEP
)) ))
.await; .await;
return BlockActionResult::SuccessServer; return BlockActionResult::SuccessServer;
@@ -105,10 +104,9 @@ impl BlockBehaviour for RespawnAnchorBlock {
); );
args.player args.player
.send_system_message(&TextComponent::translate_cross( .send_system_message(&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_SET_SPAWN, translation::java::BLOCK_MINECRAFT_SET_SPAWN,
translation::bedrock::TILE_BED_RESPAWNSET, translation::bedrock::TILE_BED_RESPAWNSET
[],
)) ))
.await; .await;
} }

View File

@@ -40,10 +40,9 @@ impl ScreenHandlerFactory for ShulkerBoxScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_SHULKERBOX, translation::java::CONTAINER_SHULKERBOX,
translation::bedrock::CONTAINER_SHULKERBOX, translation::bedrock::CONTAINER_SHULKERBOX
&[],
) )
} }
} }

View File

@@ -15,7 +15,6 @@ use pumpkin_inventory::{
screen_handler::{BoxFuture, InventoryPlayer, ScreenHandlerFactory, SharedScreenHandler}, screen_handler::{BoxFuture, InventoryPlayer, ScreenHandlerFactory, SharedScreenHandler},
}; };
use pumpkin_macros::pumpkin_block; use pumpkin_macros::pumpkin_block;
use pumpkin_util::text::TextComponent;
use pumpkin_world::inventory::Inventory; use pumpkin_world::inventory::Inventory;
use tokio::sync::Mutex; use tokio::sync::Mutex;
@@ -72,10 +71,9 @@ impl ScreenHandlerFactory for SmokerScreenFactory {
} }
fn get_display_name(&self) -> pumpkin_util::text::TextComponent { fn get_display_name(&self) -> pumpkin_util::text::TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_SMOKER, translation::java::CONTAINER_SMOKER,
translation::bedrock::TILE_SMOKER_NAME, translation::bedrock::TILE_SMOKER_NAME
&[],
) )
} }
} }

View File

@@ -54,10 +54,9 @@ impl ScreenHandlerFactory for StonecutterScreenFactory {
} }
fn get_display_name(&self) -> TextComponent { fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::CONTAINER_STONECUTTER, translation::java::CONTAINER_STONECUTTER,
translation::bedrock::CONTAINER_STONECUTTER, translation::bedrock::CONTAINER_STONECUTTER
&[],
) )
} }
} }

View File

@@ -74,10 +74,9 @@ impl ArgumentConsumer for HexColorArgumentConsumer {
let result = parse_hex_color(raw_arg.value) let result = parse_hex_color(raw_arg.value)
.map(|color| Some(Arg::HexColor(color))) .map(|color| Some(Arg::HexColor(color)))
.ok_or_else(|| { .ok_or_else(|| {
INVALID_HEX_ERROR_TYPE.create_without_context(TextComponent::translate( INVALID_HEX_ERROR_TYPE.create_without_context_args_slice(&[TextComponent::text(
translation::java::ARGUMENT_HEXCOLOR_INVALID, raw_arg.value.to_string(),
[TextComponent::text(raw_arg.value.to_string())], )])
))
}); });
Box::pin(async move { result }) Box::pin(async move { result })

View File

@@ -76,10 +76,9 @@ impl ArgumentConsumer for TeamColorArgumentConsumer {
let result = NamedColor::try_from(raw_arg.value) let result = NamedColor::try_from(raw_arg.value)
.map(|color| Some(Arg::TeamColor(color))) .map(|color| Some(Arg::TeamColor(color)))
.map_err(|()| { .map_err(|()| {
INVALID_COLOR_ERROR_TYPE.create_without_context(TextComponent::translate( INVALID_COLOR_ERROR_TYPE.create_without_context_args_slice(&[TextComponent::text(
translation::java::ARGUMENT_COLOR_INVALID, raw_arg.value.to_string(),
[TextComponent::text(raw_arg.value.to_string())], )])
))
}); });
Box::pin(async move { result }) Box::pin(async move { result })

View File

@@ -165,14 +165,13 @@ impl CommandExecutor for PlaceTemplateExecutor {
context context
.source .source
.send_feedback( .send_feedback(
TextComponent::translate( pumpkin_macros::translate_cross!(
translation::java::COMMANDS_PLACE_TEMPLATE_SUCCESS, translation::java::COMMANDS_PLACE_TEMPLATE_SUCCESS,
[ translation::bedrock::COMMANDS_PLACE_SUCCESS,
TextComponent::text(template_name.clone()), TextComponent::text(template_name.clone()),
TextComponent::text(block_pos.0.x.to_string()), TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()), TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string()), TextComponent::text(block_pos.0.z.to_string())
],
), ),
true, true,
) )
@@ -198,7 +197,7 @@ impl CommandExecutor for PlaceJigsawExecutor {
BlockPos::new(p.x as i32, p.y as i32, p.z as i32) BlockPos::new(p.x as i32, p.y as i32, p.z as i32)
}); });
let (piece_count, placer) = { let (_piece_count, placer) = {
let seed = hash_block_pos(block_pos.0.x, block_pos.0.y, block_pos.0.z) as u64; let seed = hash_block_pos(block_pos.0.x, block_pos.0.y, block_pos.0.z) as u64;
let random = RandomGenerator::Legacy(LegacyRand::from_seed(seed)); let random = RandomGenerator::Legacy(LegacyRand::from_seed(seed));
let world_gen = &context.world().level.world_gen; let world_gen = &context.world().level.world_gen;
@@ -259,14 +258,12 @@ impl CommandExecutor for PlaceJigsawExecutor {
context context
.source .source
.send_feedback( .send_feedback(
TextComponent::translate( pumpkin_macros::translate_cross!(
translation::java::COMMANDS_PLACE_JIGSAW_SUCCESS, translation::java::COMMANDS_PLACE_JIGSAW_SUCCESS,
[ translation::bedrock::COMMANDS_PLACE_SUCCESS,
TextComponent::text(piece_count.to_string()), TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.x.to_string()), TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.y.to_string()), TextComponent::text(block_pos.0.z.to_string())
TextComponent::text(block_pos.0.z.to_string()),
],
), ),
true, true,
) )
@@ -525,14 +522,13 @@ impl CommandExecutor for PlaceStructureExecutor {
context context
.source .source
.send_feedback( .send_feedback(
TextComponent::translate( pumpkin_macros::translate_cross!(
translation::java::COMMANDS_PLACE_STRUCTURE_SUCCESS, translation::java::COMMANDS_PLACE_STRUCTURE_SUCCESS,
[ translation::bedrock::COMMANDS_PLACE_SUCCESS,
TextComponent::text(structure_name), TextComponent::text(structure_name),
TextComponent::text(block_pos.0.x.to_string()), TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()), TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string()), TextComponent::text(block_pos.0.z.to_string())
],
), ),
true, true,
) )
@@ -642,14 +638,13 @@ impl CommandExecutor for PlaceFeatureExecutor {
context context
.source .source
.send_feedback( .send_feedback(
TextComponent::translate( pumpkin_macros::translate_cross!(
translation::java::COMMANDS_PLACE_FEATURE_SUCCESS, translation::java::COMMANDS_PLACE_FEATURE_SUCCESS,
[ translation::bedrock::COMMANDS_PLACE_SUCCESS,
TextComponent::text(feature_name), TextComponent::text(feature_name),
TextComponent::text(block_pos.0.x.to_string()), TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()), TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string()), TextComponent::text(block_pos.0.z.to_string())
],
), ),
true, true,
) )

View File

@@ -81,9 +81,10 @@ impl CommandExecutor for QueryExecutor {
QueryMode::GameTime => { QueryMode::GameTime => {
let game_time = level_time.query_gametime(); let game_time = level_time.query_gametime();
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_QUERY_GAMETIME, translation::java::COMMANDS_TIME_QUERY_GAMETIME,
[TextComponent::text(game_time.to_string())], translation::bedrock::COMMANDS_TIME_QUERY_GAMETIME,
TextComponent::text(game_time.to_string())
)) ))
.await; .await;
Ok(wrap_time(game_time)) Ok(wrap_time(game_time))
@@ -91,12 +92,11 @@ impl CommandExecutor for QueryExecutor {
QueryMode::Time => { QueryMode::Time => {
let total_ticks = level_time.time_of_day; let total_ticks = level_time.time_of_day;
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_QUERY_ABSOLUTE, translation::java::COMMANDS_TIME_QUERY_ABSOLUTE,
[ translation::bedrock::COMMANDS_TIME_QUERY_DAYTIME,
TextComponent::text(clock_name.to_string()), TextComponent::text(clock_name.to_string()),
TextComponent::text(total_ticks.to_string()), TextComponent::text(total_ticks.to_string())
],
)) ))
.await; .await;
Ok(wrap_time(total_ticks)) Ok(wrap_time(total_ticks))
@@ -104,21 +104,21 @@ impl CommandExecutor for QueryExecutor {
QueryMode::DayTime => { QueryMode::DayTime => {
let curr_time = level_time.query_daytime(); let curr_time = level_time.query_daytime();
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_QUERY, translation::java::COMMANDS_TIME_QUERY,
translation::bedrock::COMMANDS_TIME_QUERY_DAYTIME, translation::bedrock::COMMANDS_TIME_QUERY_DAYTIME,
[TextComponent::text(curr_time.to_string())], TextComponent::text(curr_time.to_string())
)) ))
.await; .await;
Ok(curr_time as i32) Ok(wrap_time(curr_time))
} }
QueryMode::Day => { QueryMode::Day => {
let curr_time = level_time.query_day(); let curr_time = level_time.query_day();
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_QUERY, translation::java::COMMANDS_TIME_QUERY,
translation::bedrock::COMMANDS_TIME_QUERY_DAY, translation::bedrock::COMMANDS_TIME_QUERY_DAY,
[TextComponent::text(curr_time.to_string())], TextComponent::text(curr_time.to_string())
)) ))
.await; .await;
Ok(curr_time as i32) Ok(curr_time as i32)
@@ -161,12 +161,11 @@ impl CommandExecutor for ActionExecutor {
level_time.set_time(time_count.into()); level_time.set_time(time_count.into());
level_time.send_time(world).await; level_time.send_time(world).await;
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_SET_ABSOLUTE, translation::java::COMMANDS_TIME_SET_ABSOLUTE,
[ translation::bedrock::COMMANDS_TIME_SET,
TextComponent::text(clock_name.to_string()), TextComponent::text(clock_name.to_string()),
TextComponent::text(time_count.to_string()), TextComponent::text(time_count.to_string())
],
)) ))
.await; .await;
Ok(time_count) Ok(time_count)
@@ -177,12 +176,11 @@ impl CommandExecutor for ActionExecutor {
level_time.send_time(world).await; level_time.send_time(world).await;
let total_ticks = level_time.time_of_day; let total_ticks = level_time.time_of_day;
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_SET_ABSOLUTE, translation::java::COMMANDS_TIME_SET_ABSOLUTE,
[ translation::bedrock::COMMANDS_TIME_ADDED,
TextComponent::text(clock_name.to_string()), TextComponent::text(clock_name.to_string()),
TextComponent::text(total_ticks.to_string()), TextComponent::text(total_ticks.to_string())
],
)) ))
.await; .await;
Ok(wrap_time(total_ticks)) Ok(wrap_time(total_ticks))
@@ -191,9 +189,10 @@ impl CommandExecutor for ActionExecutor {
level_time.set_paused(true); level_time.set_paused(true);
level_time.send_time(world).await; level_time.send_time(world).await;
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_PAUSE, translation::java::COMMANDS_TIME_PAUSE,
[TextComponent::text(clock_name.to_string())], translation::bedrock::COMMANDS_TIME_STOP,
TextComponent::text(clock_name.to_string())
)) ))
.await; .await;
Ok(1) Ok(1)
@@ -202,9 +201,10 @@ impl CommandExecutor for ActionExecutor {
level_time.set_paused(false); level_time.set_paused(false);
level_time.send_time(world).await; level_time.send_time(world).await;
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_RESUME, translation::java::COMMANDS_TIME_RESUME,
[TextComponent::text(clock_name.to_string())], translation::bedrock::COMMANDS_TIME_SET,
TextComponent::text(clock_name.to_string())
)) ))
.await; .await;
Ok(1) Ok(1)
@@ -218,12 +218,11 @@ impl CommandExecutor for ActionExecutor {
level_time.set_rate(rate); level_time.set_rate(rate);
level_time.send_time(world).await; level_time.send_time(world).await;
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_RATE, translation::java::COMMANDS_TIME_RATE,
[ translation::bedrock::COMMANDS_TIME_SET,
TextComponent::text(clock_name.to_string()), TextComponent::text(clock_name.to_string()),
TextComponent::text(rate.to_string()), TextComponent::text(rate.to_string())
],
)) ))
.await; .await;
Ok(1) Ok(1)

View File

@@ -35,9 +35,10 @@ impl CommandExecutor for ListExecutor {
let dimension = world.dimension.minecraft_name.to_string(); let dimension = world.dimension.minecraft_name.to_string();
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WAYPOINT_LIST_EMPTY, translation::java::COMMANDS_WAYPOINT_LIST_EMPTY,
[TextComponent::text(dimension)], translation::java::COMMANDS_WAYPOINT_LIST_EMPTY,
TextComponent::text(dimension)
)) ))
.await; .await;
Ok(0) Ok(0)
@@ -98,9 +99,10 @@ impl CommandExecutor for ColorExecutor {
ColorAction::Named => { ColorAction::Named => {
let color = TeamColorArgumentConsumer::find_arg(args, ARG_COLOR)?; let color = TeamColorArgumentConsumer::find_arg(args, ARG_COLOR)?;
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR, translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR,
[TextComponent::text(color.name()).color_named(color)], translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR,
TextComponent::text(color.name()).color_named(color)
)) ))
.await; .await;
} }
@@ -108,17 +110,18 @@ impl CommandExecutor for ColorExecutor {
let color_val = HexColorArgumentConsumer::find_arg(args, ARG_COLOR)?; let color_val = HexColorArgumentConsumer::find_arg(args, ARG_COLOR)?;
let hex_str = format!("{:06X}", color_val & 0xFFFFFF); let hex_str = format!("{:06X}", color_val & 0xFFFFFF);
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR, translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR,
[TextComponent::text(hex_str)], translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR,
TextComponent::text(hex_str)
)) ))
.await; .await;
} }
ColorAction::Reset => { ColorAction::Reset => {
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR_RESET, translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR_RESET,
[], translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR_RESET
)) ))
.await; .await;
} }
@@ -176,9 +179,9 @@ impl CommandExecutor for StyleExecutor {
} }
sender sender
.send_message(TextComponent::translate( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WAYPOINT_MODIFY_STYLE, translation::java::COMMANDS_WAYPOINT_MODIFY_STYLE,
[], translation::java::COMMANDS_WAYPOINT_MODIFY_STYLE
)) ))
.await; .await;

View File

@@ -37,10 +37,9 @@ async fn kick_non_whitelisted_players(server: &Server) {
player player
.kick( .kick(
DisconnectReason::Kicked, DisconnectReason::Kicked,
TextComponent::translate_cross( pumpkin_macros::translate_cross!(
translation::java::MULTIPLAYER_DISCONNECT_NOT_WHITELISTED, translation::java::MULTIPLAYER_DISCONNECT_NOT_WHITELISTED,
translation::java::MULTIPLAYER_DISCONNECT_NOT_WHITELISTED, translation::bedrock::DISCONNECT_KICKED
&[],
), ),
) )
.await; .await;
@@ -60,18 +59,18 @@ impl CommandExecutor for OnExecutor {
Box::pin(async move { Box::pin(async move {
let previous = server.white_list.swap(true, Ordering::Relaxed); let previous = server.white_list.swap(true, Ordering::Relaxed);
if previous { if previous {
Err(CommandError::CommandFailed(TextComponent::translate_cross( Err(CommandError::CommandFailed(
translation::java::COMMANDS_WHITELIST_ALREADYON, pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_ALREADYON, translation::java::COMMANDS_WHITELIST_ALREADYON,
&[], translation::bedrock::COMMANDS_ALLOWLIST_ENABLED
))) ),
))
} else { } else {
kick_non_whitelisted_players(server).await; kick_non_whitelisted_players(server).await;
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_ENABLED, translation::java::COMMANDS_WHITELIST_ENABLED,
translation::java::COMMANDS_WHITELIST_ENABLED, translation::bedrock::COMMANDS_ALLOWLIST_ENABLED
&[],
)) ))
.await; .await;
Ok(1) Ok(1)
@@ -93,19 +92,19 @@ impl CommandExecutor for OffExecutor {
let previous = server.white_list.swap(false, Ordering::Relaxed); let previous = server.white_list.swap(false, Ordering::Relaxed);
if previous { if previous {
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_DISABLED, translation::java::COMMANDS_WHITELIST_DISABLED,
translation::java::COMMANDS_WHITELIST_DISABLED, translation::bedrock::COMMANDS_ALLOWLIST_DISABLED
&[],
)) ))
.await; .await;
Ok(1) Ok(1)
} else { } else {
Err(CommandError::CommandFailed(TextComponent::translate_cross( Err(CommandError::CommandFailed(
translation::java::COMMANDS_WHITELIST_ALREADYOFF, pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_ALREADYOFF, translation::java::COMMANDS_WHITELIST_ALREADYOFF,
&[], translation::bedrock::COMMANDS_ALLOWLIST_DISABLED
))) ),
))
} }
}) })
} }
@@ -124,10 +123,9 @@ impl CommandExecutor for ListExecutor {
let whitelist = &server.data.whitelist_config.read().await.whitelist; let whitelist = &server.data.whitelist_config.read().await.whitelist;
if whitelist.is_empty() { if whitelist.is_empty() {
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_NONE, translation::java::COMMANDS_WHITELIST_NONE,
translation::java::COMMANDS_WHITELIST_NONE, translation::bedrock::COMMANDS_ALLOWLIST_LIST
[],
)) ))
.await; .await;
return Ok(0); return Ok(0);
@@ -142,13 +140,11 @@ impl CommandExecutor for ListExecutor {
let names_len = names.len() as i32; let names_len = names.len() as i32;
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_LIST, translation::java::COMMANDS_WHITELIST_LIST,
translation::java::COMMANDS_WHITELIST_LIST, translation::bedrock::COMMANDS_ALLOWLIST_LIST,
[ TextComponent::text(whitelist.len().to_string()),
TextComponent::text(whitelist.len().to_string()), TextComponent::text(names)
TextComponent::text(names),
],
)) ))
.await; .await;
@@ -170,10 +166,9 @@ impl CommandExecutor for ReloadExecutor {
*server.data.whitelist_config.write().await = WhitelistConfig::load(); *server.data.whitelist_config.write().await = WhitelistConfig::load();
kick_non_whitelisted_players(server).await; kick_non_whitelisted_players(server).await;
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_RELOADED, translation::java::COMMANDS_WHITELIST_RELOADED,
translation::java::COMMANDS_WHITELIST_RELOADED, translation::bedrock::COMMANDS_ALLOWLIST_RELOADED
&[],
)) ))
.await; .await;
Ok(1) Ok(1)
@@ -212,10 +207,10 @@ impl CommandExecutor for AddExecutor {
.whitelist .whitelist
.push(WhitelistEntry::new(profile.id, profile.name.clone())); .push(WhitelistEntry::new(profile.id, profile.name.clone()));
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_ADD_SUCCESS, translation::java::COMMANDS_WHITELIST_ADD_SUCCESS,
translation::java::COMMANDS_WHITELIST_ADD_SUCCESS, translation::bedrock::COMMANDS_ALLOWLIST_ADD_SUCCESS,
[TextComponent::text(profile.name.clone())], TextComponent::text(profile.name.clone())
)) ))
.await; .await;
successes += 1; successes += 1;
@@ -224,11 +219,12 @@ impl CommandExecutor for AddExecutor {
whitelist.save(); whitelist.save();
if successes == 0 { if successes == 0 {
Err(CommandError::CommandFailed(TextComponent::translate_cross( Err(CommandError::CommandFailed(
translation::java::COMMANDS_WHITELIST_ADD_FAILED, pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_ADD_FAILED, translation::java::COMMANDS_WHITELIST_ADD_FAILED,
&[], translation::bedrock::COMMANDS_ALLOWLIST_ADD_FAILED
))) ),
))
} else { } else {
Ok(successes) Ok(successes)
} }
@@ -261,10 +257,10 @@ impl CommandExecutor for RemoveExecutor {
if let Some(i) = i { if let Some(i) = i {
whitelist.whitelist.remove(i); whitelist.whitelist.remove(i);
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_REMOVE_SUCCESS, translation::java::COMMANDS_WHITELIST_REMOVE_SUCCESS,
translation::java::COMMANDS_WHITELIST_REMOVE_SUCCESS, translation::bedrock::COMMANDS_ALLOWLIST_REMOVE_SUCCESS,
[TextComponent::text(player.name.clone())], TextComponent::text(player.name.clone())
)) ))
.await; .await;
successes += 1; successes += 1;
@@ -277,11 +273,12 @@ impl CommandExecutor for RemoveExecutor {
kick_non_whitelisted_players(server).await; kick_non_whitelisted_players(server).await;
if successes == 0 { if successes == 0 {
Err(CommandError::CommandFailed(TextComponent::translate_cross( Err(CommandError::CommandFailed(
translation::java::COMMANDS_WHITELIST_REMOVE_FAILED, pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_REMOVE_FAILED, translation::java::COMMANDS_WHITELIST_REMOVE_FAILED,
&[], translation::bedrock::COMMANDS_ALLOWLIST_REMOVE_FAILED
))) ),
))
} else { } else {
Ok(successes) Ok(successes)
} }

View File

@@ -1,3 +1,4 @@
use pumpkin_data::translation;
use pumpkin_util::{math::vector2::Vector2, text::TextComponent}; use pumpkin_util::{math::vector2::Vector2, text::TextComponent};
use crate::command::{ use crate::command::{
@@ -16,8 +17,6 @@ const NAMES: [&str; 1] = ["worldborder"];
const DESCRIPTION: &str = "Worldborder command."; const DESCRIPTION: &str = "Worldborder command.";
const NOTHING_CHANGED_EXCEPTION: &str = "commands.worldborder.set.failed.nochange";
const fn distance_consumer() -> BoundedNumArgumentConsumer<f64> { const fn distance_consumer() -> BoundedNumArgumentConsumer<f64> {
BoundedNumArgumentConsumer::new().min(0.0).name("distance") BoundedNumArgumentConsumer::new().min(0.0).name("distance")
} }
@@ -59,10 +58,10 @@ impl CommandExecutor for GetExecutor {
let diameter = border.new_diameter.round() as i32; let diameter = border.new_diameter.round() as i32;
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.get", translation::java::COMMANDS_WORLDBORDER_GET,
"commands.worldborder.get", translation::bedrock::COMMANDS_WORLDBORDER_GET_SUCCESS,
[TextComponent::text(diameter.to_string())], TextComponent::text(diameter.to_string())
)) ))
.await; .await;
@@ -96,22 +95,24 @@ impl CommandExecutor for SetExecutor {
}; };
if (distance - border.new_diameter).abs() < f64::EPSILON { if (distance - border.new_diameter).abs() < f64::EPSILON {
return Err(CommandError::CommandFailed(TextComponent::translate_cross( return Err(CommandError::CommandFailed(
NOTHING_CHANGED_EXCEPTION, pumpkin_macros::translate_cross!(
NOTHING_CHANGED_EXCEPTION, translation::java::COMMANDS_WORLDBORDER_SET_FAILED_NOCHANGE,
[], translation::bedrock::COMMANDS_WORLDBORDER_SET_SUCCESS
))); ),
));
} }
let d = border.new_diameter;
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.set.immediate", translation::java::COMMANDS_WORLDBORDER_SET_IMMEDIATE,
"commands.worldborder.set.immediate", translation::bedrock::COMMANDS_WORLDBORDER_SET_SUCCESS,
[TextComponent::text(format!("{distance:.1}"))], TextComponent::text(format!("{distance:.1}")),
TextComponent::text(format!("{d:.1}"))
)) ))
.await; .await;
let d = border.new_diameter;
border.set_diameter(world, distance, None); border.set_diameter(world, distance, None);
Ok((distance - d) as i32) Ok((distance - d) as i32)
@@ -149,37 +150,37 @@ impl CommandExecutor for SetTimeExecutor {
)))); ))));
}; };
let old_dist = format!("{:.1}", border.new_diameter);
match distance.total_cmp(&border.new_diameter) { match distance.total_cmp(&border.new_diameter) {
std::cmp::Ordering::Equal => { std::cmp::Ordering::Equal => {
return Err(CommandError::CommandFailed(TextComponent::translate_cross( return Err(CommandError::CommandFailed(
NOTHING_CHANGED_EXCEPTION, pumpkin_macros::translate_cross!(
NOTHING_CHANGED_EXCEPTION, translation::java::COMMANDS_WORLDBORDER_SET_FAILED_NOCHANGE,
[], translation::bedrock::COMMANDS_WORLDBORDER_SET_SUCCESS
))); ),
));
} }
std::cmp::Ordering::Less => { std::cmp::Ordering::Less => {
let dist = format!("{distance:.1}"); let dist = format!("{distance:.1}");
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.set.shrink", translation::java::COMMANDS_WORLDBORDER_SET_SHRINK,
"commands.worldborder.set.shrink", translation::bedrock::COMMANDS_WORLDBORDER_SETSLOWLY_SHRINK_SUCCESS,
[ TextComponent::text(dist),
TextComponent::text(dist), TextComponent::text(old_dist),
TextComponent::text(time.to_string()), TextComponent::text(time.to_string())
],
)) ))
.await; .await;
} }
std::cmp::Ordering::Greater => { std::cmp::Ordering::Greater => {
let dist = format!("{distance:.1}"); let dist = format!("{distance:.1}");
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.set.grow", translation::java::COMMANDS_WORLDBORDER_SET_GROW,
"commands.worldborder.set.grow", translation::bedrock::COMMANDS_WORLDBORDER_SETSLOWLY_GROW_SUCCESS,
[ TextComponent::text(dist),
TextComponent::text(dist), TextComponent::text(old_dist),
TextComponent::text(time.to_string()), TextComponent::text(time.to_string())
],
)) ))
.await; .await;
} }
@@ -218,21 +219,24 @@ impl CommandExecutor for AddExecutor {
}; };
if distance_add == 0.0 { if distance_add == 0.0 {
return Err(CommandError::CommandFailed(TextComponent::translate_cross( return Err(CommandError::CommandFailed(
NOTHING_CHANGED_EXCEPTION, pumpkin_macros::translate_cross!(
NOTHING_CHANGED_EXCEPTION, translation::java::COMMANDS_WORLDBORDER_SET_FAILED_NOCHANGE,
[], translation::bedrock::COMMANDS_WORLDBORDER_SET_SUCCESS
))); ),
));
} }
let distance = border.new_diameter + distance_add; let distance = border.new_diameter + distance_add;
let dist = format!("{distance:.1}"); let dist = format!("{distance:.1}");
let old_dist = format!("{:.1}", border.new_diameter);
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.set.immediate", translation::java::COMMANDS_WORLDBORDER_SET_IMMEDIATE,
"commands.worldborder.set.immediate", translation::bedrock::COMMANDS_WORLDBORDER_SET_SUCCESS,
[TextComponent::text(dist)], TextComponent::text(dist),
TextComponent::text(old_dist)
)) ))
.await; .await;
border.set_diameter(world, distance, None); border.set_diameter(world, distance, None);
@@ -273,6 +277,7 @@ impl CommandExecutor for AddTimeExecutor {
let distance = distance_add + border.new_diameter; let distance = distance_add + border.new_diameter;
let old_dist = format!("{:.1}", border.new_diameter);
match distance.total_cmp(&border.new_diameter) { match distance.total_cmp(&border.new_diameter) {
std::cmp::Ordering::Equal => { std::cmp::Ordering::Equal => {
return Err(CommandError::CommandFailed(TextComponent::text(format!( return Err(CommandError::CommandFailed(TextComponent::text(format!(
@@ -283,26 +288,24 @@ impl CommandExecutor for AddTimeExecutor {
std::cmp::Ordering::Less => { std::cmp::Ordering::Less => {
let dist = format!("{distance:.1}"); let dist = format!("{distance:.1}");
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.set.shrink", translation::java::COMMANDS_WORLDBORDER_SET_SHRINK,
"commands.worldborder.set.shrink", translation::bedrock::COMMANDS_WORLDBORDER_SETSLOWLY_SHRINK_SUCCESS,
[ TextComponent::text(dist),
TextComponent::text(dist), TextComponent::text(old_dist),
TextComponent::text(time.to_string()), TextComponent::text(time.to_string())
],
)) ))
.await; .await;
} }
std::cmp::Ordering::Greater => { std::cmp::Ordering::Greater => {
let dist = format!("{distance:.1}"); let dist = format!("{distance:.1}");
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.set.grow", translation::java::COMMANDS_WORLDBORDER_SET_GROW,
"commands.worldborder.set.grow", translation::bedrock::COMMANDS_WORLDBORDER_SETSLOWLY_GROW_SUCCESS,
[ TextComponent::text(dist),
TextComponent::text(dist), TextComponent::text(old_dist),
TextComponent::text(time.to_string()), TextComponent::text(time.to_string())
],
)) ))
.await; .await;
} }
@@ -335,13 +338,11 @@ impl CommandExecutor for CenterExecutor {
let Vector2 { x, y } = Position2DArgumentConsumer.find_arg_default_name(args)?; let Vector2 { x, y } = Position2DArgumentConsumer.find_arg_default_name(args)?;
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.center.success", translation::java::COMMANDS_WORLDBORDER_CENTER_SUCCESS,
"commands.worldborder.center.success", translation::bedrock::COMMANDS_WORLDBORDER_CENTER_SUCCESS,
[ TextComponent::text(format!("{x:.2}")),
TextComponent::text(format!("{x:.2}")), TextComponent::text(format!("{y:.2}"))
TextComponent::text(format!("{y:.2}")),
],
)) ))
.await; .await;
border.set_center(world, x, y); border.set_center(world, x, y);
@@ -376,19 +377,22 @@ impl CommandExecutor for DamageAmountExecutor {
}; };
if (damage_per_block - border.damage_per_block).abs() < f32::EPSILON { if (damage_per_block - border.damage_per_block).abs() < f32::EPSILON {
return Err(CommandError::CommandFailed(TextComponent::translate_cross( return Err(CommandError::CommandFailed(
"commands.worldborder.damage.amount.failed", pumpkin_macros::translate_cross!(
"commands.worldborder.damage.amount.failed", translation::java::COMMANDS_WORLDBORDER_DAMAGE_AMOUNT_FAILED,
[], translation::bedrock::COMMANDS_WORLDBORDER_DAMAGE_AMOUNT_SUCCESS
))); ),
));
} }
let damage = format!("{damage_per_block:.2}"); let damage = format!("{damage_per_block:.2}");
let old_damage = format!("{:.2}", border.damage_per_block);
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.damage.amount.success", translation::java::COMMANDS_WORLDBORDER_DAMAGE_AMOUNT_SUCCESS,
"commands.worldborder.damage.amount.success", translation::bedrock::COMMANDS_WORLDBORDER_DAMAGE_AMOUNT_SUCCESS,
[TextComponent::text(damage)], TextComponent::text(damage),
TextComponent::text(old_damage)
)) ))
.await; .await;
border.damage_per_block = damage_per_block; border.damage_per_block = damage_per_block;
@@ -422,19 +426,22 @@ impl CommandExecutor for DamageBufferExecutor {
}; };
if (buffer - border.buffer).abs() < f32::EPSILON { if (buffer - border.buffer).abs() < f32::EPSILON {
return Err(CommandError::CommandFailed(TextComponent::translate_cross( return Err(CommandError::CommandFailed(
"commands.worldborder.damage.amount.failed", pumpkin_macros::translate_cross!(
"commands.worldborder.damage.amount.failed", translation::java::COMMANDS_WORLDBORDER_DAMAGE_BUFFER_FAILED,
[], translation::bedrock::COMMANDS_WORLDBORDER_DAMAGE_BUFFER_SUCCESS
))); ),
));
} }
let buf = format!("{buffer:.2}"); let buf = format!("{buffer:.2}");
let old_buf = format!("{:.2}", border.buffer);
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.damage.buffer.success", translation::java::COMMANDS_WORLDBORDER_DAMAGE_BUFFER_SUCCESS,
"commands.worldborder.damage.buffer.success", translation::bedrock::COMMANDS_WORLDBORDER_DAMAGE_BUFFER_SUCCESS,
[TextComponent::text(buf)], TextComponent::text(buf),
TextComponent::text(old_buf)
)) ))
.await; .await;
border.buffer = buffer; border.buffer = buffer;
@@ -468,18 +475,20 @@ impl CommandExecutor for WarningDistanceExecutor {
}; };
if distance == border.warning_blocks { if distance == border.warning_blocks {
return Err(CommandError::CommandFailed(TextComponent::translate_cross( return Err(CommandError::CommandFailed(
"commands.worldborder.warning.distance.failed", pumpkin_macros::translate_cross!(
"commands.worldborder.warning.distance.failed", translation::java::COMMANDS_WORLDBORDER_WARNING_DISTANCE_FAILED,
[], translation::bedrock::COMMANDS_WORLDBORDER_WARNING_DISTANCE_SUCCESS
))); ),
));
} }
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.warning.distance.success", translation::java::COMMANDS_WORLDBORDER_WARNING_DISTANCE_SUCCESS,
"commands.worldborder.warning.distance.success", translation::bedrock::COMMANDS_WORLDBORDER_WARNING_DISTANCE_SUCCESS,
[TextComponent::text(distance.to_string())], TextComponent::text(distance.to_string()),
TextComponent::text(border.warning_blocks.to_string())
)) ))
.await; .await;
border.set_warning_distance(world, distance); border.set_warning_distance(world, distance);
@@ -513,18 +522,20 @@ impl CommandExecutor for WarningTimeExecutor {
}; };
if time == border.warning_time { if time == border.warning_time {
return Err(CommandError::CommandFailed(TextComponent::translate_cross( return Err(CommandError::CommandFailed(
"commands.worldborder.warning.time.failed", pumpkin_macros::translate_cross!(
"commands.worldborder.warning.time.failed", translation::java::COMMANDS_WORLDBORDER_WARNING_TIME_FAILED,
[], translation::bedrock::COMMANDS_WORLDBORDER_WARNING_TIME_SUCCESS
))); ),
));
} }
sender sender
.send_message(TextComponent::translate_cross( .send_message(pumpkin_macros::translate_cross!(
"commands.worldborder.warning.time.success", translation::java::COMMANDS_WORLDBORDER_WARNING_TIME_SUCCESS,
"commands.worldborder.warning.time.success", translation::bedrock::COMMANDS_WORLDBORDER_WARNING_TIME_SUCCESS,
[TextComponent::text(time.to_string())], TextComponent::text(time.to_string()),
TextComponent::text(border.warning_time.to_string())
)) ))
.await; .await;
border.set_warning_delay(world, time); border.set_warning_delay(world, time);

View File

@@ -1,7 +1,7 @@
#![deny(clippy::unwrap_used)] #![deny(clippy::unwrap_used)]
#![cfg_attr(test, allow(clippy::unwrap_used, clippy::expect_used, clippy::panic))] #![cfg_attr(test, allow(clippy::unwrap_used, clippy::expect_used, clippy::panic))]
// Not warn event sending macros // Not warn event sending macros
#![allow(unused_labels)] #![allow(unused_labels, deprecated)]
#[macro_use] #[macro_use]
extern crate pumpkin_macros; extern crate pumpkin_macros;

View File

@@ -250,9 +250,9 @@ impl JavaClient {
{ {
self.wait_for_keep_alive.store(false, Ordering::Relaxed); self.wait_for_keep_alive.store(false, Ordering::Relaxed);
} else { } else {
self.kick(TextComponent::translate( self.kick(pumpkin_macros::translate_cross!(
translation::java::DISCONNECT_TIMEOUT, translation::java::DISCONNECT_TIMEOUT,
[], translation::bedrock::DISCONNECT_TIMEOUT
)) ))
.await; .await;
} }

View File

@@ -198,7 +198,7 @@ impl JavaClient {
_ = keep_alive_interval.tick() => { _ = keep_alive_interval.tick() => {
// If the client never responded to the LAST keep-alive, they timed out. // If the client never responded to the LAST keep-alive, they timed out.
if self.wait_for_keep_alive.load(Ordering::Relaxed) { if self.wait_for_keep_alive.load(Ordering::Relaxed) {
self.kick(TextComponent::translate(translation::java::DISCONNECT_TIMEOUT, [])).await; self.kick(pumpkin_macros::translate_cross!(translation::java::DISCONNECT_TIMEOUT, translation::bedrock::DISCONNECT_TIMEOUT)).await;
break; break;
} }

View File

@@ -2193,9 +2193,9 @@ impl JavaClient {
); );
self.wait_for_keep_alive.store(false, Ordering::Relaxed); self.wait_for_keep_alive.store(false, Ordering::Relaxed);
} else { } else {
self.kick(TextComponent::translate( self.kick(pumpkin_macros::translate_cross!(
translation::java::DISCONNECT_TIMEOUT, translation::java::DISCONNECT_TIMEOUT,
[], translation::bedrock::DISCONNECT_TIMEOUT
)) ))
.await; .await;
} }

View File

@@ -27,5 +27,10 @@ syn = { version = "3.0", features = ["full", "extra-traits"] }
pumpkin-util = { path = "../../crates/pumpkin-util", features = ["codegen"] } pumpkin-util = { path = "../../crates/pumpkin-util", features = ["codegen"] }
pumpkin-nbt = { path = "../../crates/pumpkin-nbt" } pumpkin-nbt = { path = "../../crates/pumpkin-nbt" }
[lints] [lints.clippy]
workspace = true expect_used = "allow"
unwrap_used = "allow"
panic = "allow"
indexing_slicing = "allow"
pedantic = { level = "allow", priority = -1 }
all = { level = "allow", priority = -1 }

View File

@@ -314,6 +314,7 @@ pub fn build() -> TokenStream {
} }
true true
} }
#[allow(deprecated)]
pub fn get_fullname(&self, level: i32) -> TextComponent { pub fn get_fullname(&self, level: i32) -> TextComponent {
let mut ret = TextComponent::translate(self.description, []).color_named( let mut ret = TextComponent::translate(self.description, []).color_named(
if self.has_tag(&EnchantmentTag::MINECRAFT_CURSE) { if self.has_tag(&EnchantmentTag::MINECRAFT_CURSE) {

View File

@@ -1614,13 +1614,20 @@ pub fn build() -> TokenStream {
#constants #constants
#[must_use] #[must_use]
#[allow(deprecated)]
pub fn translated_name(&self) -> TextComponent { pub fn translated_name(&self) -> TextComponent {
TextComponent::translate( let name = self
self.components .components
.iter() .iter()
.find_map(|(id, data)| (id == &ItemName).then(|| data.as_any().downcast_ref::<ItemNameImpl>().unwrap().name)).unwrap(), .find_map(|(id, data)| {
&[], if id == &ItemName {
) data.as_any().downcast_ref::<ItemNameImpl>().map(|n| n.name)
} else {
None
}
})
.unwrap_or(self.registry_key);
TextComponent::translate(name, &[])
} }
#[doc = "Try to parse an item from a resource location string."] #[doc = "Try to parse an item from a resource location string."]

View File

@@ -9,8 +9,10 @@ pub fn build() -> TokenStream {
.unwrap(); .unwrap();
let mut java_constants = TokenStream::new(); let mut java_constants = TokenStream::new();
let mut java_match_arms = TokenStream::new();
for (name, value) in &java_json { for (name, value) in &java_json {
let ident = to_valid_ident(name); let ident = to_valid_ident(name);
let ident_str = ident.to_string();
let doc = if !value.is_empty() { let doc = if !value.is_empty() {
quote!(#[doc = #value]) quote!(#[doc = #value])
} else { } else {
@@ -20,11 +22,15 @@ pub fn build() -> TokenStream {
#doc #doc
pub const #ident: &str = #name; pub const #ident: &str = #name;
}); });
java_match_arms.extend(quote! {
#ident_str => Some(#ident),
});
} }
let bedrock_content = let bedrock_content =
fs::read_to_string("../../assets/en_us_bedrock.lang").expect("en_us_bedrock is missing"); fs::read_to_string("../../assets/en_us_bedrock.lang").expect("en_us_bedrock is missing");
let mut bedrock_constants = TokenStream::new(); let mut bedrock_constants = TokenStream::new();
let mut bedrock_match_arms = TokenStream::new();
for line in bedrock_content.lines() { for line in bedrock_content.lines() {
let line = line.trim(); let line = line.trim();
@@ -36,6 +42,7 @@ pub fn build() -> TokenStream {
let name = name.trim(); let name = name.trim();
let value = value.trim(); let value = value.trim();
let ident = to_valid_ident(name); let ident = to_valid_ident(name);
let ident_str = ident.to_string();
let doc = if !value.is_empty() { let doc = if !value.is_empty() {
quote!(#[doc = #value]) quote!(#[doc = #value])
@@ -46,6 +53,32 @@ pub fn build() -> TokenStream {
#doc #doc
pub const #ident: &str = #name; pub const #ident: &str = #name;
}); });
bedrock_match_arms.extend(quote! {
#ident_str => Some(#ident),
});
}
}
let mut java_value_match_arms = TokenStream::new();
for (name, value) in &java_json {
java_value_match_arms.extend(quote! {
#name => Some(#value),
});
}
let mut bedrock_value_match_arms = TokenStream::new();
for line in bedrock_content.lines() {
let line = line.trim();
if line.is_empty() || line.starts_with('#') || line.starts_with('/') {
continue;
}
if let Some((name, value)) = line.split_once('=') {
let name = name.trim();
let value = value.trim();
bedrock_value_match_arms.extend(quote! {
#name => Some(#value),
});
} }
} }
@@ -54,9 +87,33 @@ pub fn build() -> TokenStream {
#![allow(clippy::doc_markdown)] #![allow(clippy::doc_markdown)]
pub mod java { pub mod java {
#java_constants #java_constants
pub fn get(const_name: &str) -> Option<&'static str> {
match const_name {
#java_match_arms
_ => None,
}
}
pub fn get_value(key: &str) -> Option<&'static str> {
match key {
#java_value_match_arms
_ => None,
}
}
} }
pub mod bedrock { pub mod bedrock {
#bedrock_constants #bedrock_constants
pub fn get(const_name: &str) -> Option<&'static str> {
match const_name {
#bedrock_match_arms
_ => None,
}
}
pub fn get_value(key: &str) -> Option<&'static str> {
match key {
#bedrock_value_match_arms
_ => None,
}
}
} }
} }
} }