[INFO] cloning repository https://github.com/znikang/aiTextRpg
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/znikang/aiTextRpg" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fznikang%2FaiTextRpg", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fznikang%2FaiTextRpg'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] e43244a50eba3d353800e7a6312ac4eac036f9f1
[INFO] checking znikang/aiTextRpg against a5689b034ad287112f709693384a37f1377eb9cc for pr-129249-3
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fznikang%2FaiTextRpg" "/workspace/builds/worker-7-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-7-tc2/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/znikang/aiTextRpg
[INFO] finished tweaking git repo https://github.com/znikang/aiTextRpg
[INFO] tweaked toml for git repo https://github.com/znikang/aiTextRpg written to /workspace/builds/worker-7-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/znikang/aiTextRpg on toolchain a5689b034ad287112f709693384a37f1377eb9cc
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+a5689b034ad287112f709693384a37f1377eb9cc" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/znikang/aiTextRpg already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+a5689b034ad287112f709693384a37f1377eb9cc" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:77db811e55d90add9212f6832c23229e3de5f1c1f9905e8cb07319ea15df73ac" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] edacbf07ad96b109a3bd72720f516d08f1a5b45be80019082919a46f9c2da290
[INFO] running `Command { std: "docker" "start" "edacbf07ad96b109a3bd72720f516d08f1a5b45be80019082919a46f9c2da290", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "edacbf07ad96b109a3bd72720f516d08f1a5b45be80019082919a46f9c2da290", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "edacbf07ad96b109a3bd72720f516d08f1a5b45be80019082919a46f9c2da290" "/opt/rustwide/cargo-home/bin/cargo" "+a5689b034ad287112f709693384a37f1377eb9cc" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "edacbf07ad96b109a3bd72720f516d08f1a5b45be80019082919a46f9c2da290", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-w" "/opt/rustwide/workdir" "--user" "0:0" "edacbf07ad96b109a3bd72720f516d08f1a5b45be80019082919a46f9c2da290" "/opt/rustwide/cargo-home/bin/cargo" "+a5689b034ad287112f709693384a37f1377eb9cc" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]     Checking bytes v1.11.1
[INFO] [stderr]     Checking futures-core v0.3.32
[INFO] [stderr]     Checking smallvec v1.15.1
[INFO] [stderr]     Checking log v0.4.29
[INFO] [stderr]     Checking typenum v1.20.0
[INFO] [stderr]    Compiling zerocopy v0.8.48
[INFO] [stderr]    Compiling libc v0.2.186
[INFO] [stderr]     Checking futures-sink v0.3.32
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]    Compiling thiserror v1.0.69
[INFO] [stderr]    Compiling zmij v1.0.21
[INFO] [stderr]    Compiling tokio-macros v2.7.0
[INFO] [stderr]    Compiling futures-macro v0.3.32
[INFO] [stderr]    Compiling tracing-attributes v0.1.31
[INFO] [stderr]    Compiling thiserror-impl v1.0.69
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling unicase v2.9.0
[INFO] [stderr]     Checking futures-channel v0.3.32
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling mime_guess v2.0.5
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]     Checking sync_wrapper v1.0.2
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]     Checking utf-8 v0.7.6
[INFO] [stderr]    Compiling async-trait v0.1.89
[INFO] [stderr]     Checking memchr v2.8.0
[INFO] [stderr]     Checking tracing-log v0.2.0
[INFO] [stderr]     Checking bitflags v2.11.1
[INFO] [stderr]     Checking http-range-header v0.4.2
[INFO] [stderr]     Checking matchit v0.7.3
[INFO] [stderr]     Checking tracing-subscriber v0.3.23
[INFO] [stderr]     Checking generic-array v0.14.7
[INFO] [stderr]     Checking tracing v0.1.44
[INFO] [stderr]     Checking futures-util v0.3.32
[INFO] [stderr]     Checking http v1.4.0
[INFO] [stderr]     Checking block-buffer v0.10.4
[INFO] [stderr]     Checking crypto-common v0.1.7
[INFO] [stderr]     Checking digest v0.10.7
[INFO] [stderr]     Checking sha1 v0.10.6
[INFO] [stderr]     Checking sha2 v0.10.9
[INFO] [stderr]     Checking parking_lot_core v0.9.12
[INFO] [stderr]     Checking errno v0.3.14
[INFO] [stderr]     Checking mio v1.2.0
[INFO] [stderr]     Checking socket2 v0.6.3
[INFO] [stderr]     Checking getrandom v0.2.17
[INFO] [stderr]     Checking signal-hook-registry v1.4.8
[INFO] [stderr]     Checking uuid v1.23.1
[INFO] [stderr]     Checking http-body v1.0.1
[INFO] [stderr]     Checking parking_lot v0.12.5
[INFO] [stderr]     Checking rand_core v0.6.4
[INFO] [stderr]     Checking http-body-util v0.1.3
[INFO] [stderr]     Checking tokio v1.52.3
[INFO] [stderr]     Checking serde_path_to_error v0.1.20
[INFO] [stderr]     Checking axum-core v0.4.5
[INFO] [stderr]     Checking serde_urlencoded v0.7.1
[INFO] [stderr]     Checking ppv-lite86 v0.2.21
[INFO] [stderr]     Checking rand_chacha v0.3.1
[INFO] [stderr]     Checking rand v0.8.6
[INFO] [stderr]     Checking tungstenite v0.24.0
[INFO] [stderr]     Checking hyper v1.9.0
[INFO] [stderr]     Checking tower v0.5.3
[INFO] [stderr]     Checking tokio-util v0.7.18
[INFO] [stderr]     Checking tokio-tungstenite v0.24.0
[INFO] [stderr]     Checking tower-http v0.5.2
[INFO] [stderr]     Checking hyper-util v0.1.20
[INFO] [stderr]     Checking axum v0.7.9
[INFO] [stderr]     Checking rpg-server v0.1.0 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unused variable: `mname`
[INFO] [stdout]    --> src/main.rs:851:36
[INFO] [stdout]     |
[INFO] [stdout] 851 |     let player_died = if let Some((mname, dmg)) = &monster_atk {
[INFO] [stdout]     |                                    ^^^^^ help: if this is intentional, prefix it with an underscore: `_mname`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `player_leveled`, `exp_gained`, and `gold_gained` are never read
[INFO] [stdout]    --> src/game/mod.rs:997:9
[INFO] [stdout]     |
[INFO] [stdout] 994 | pub struct CombatResult {
[INFO] [stdout]     |            ------------ fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 997 |     pub player_leveled: bool,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout] 998 |     pub exp_gained: i32,
[INFO] [stdout]     |         ^^^^^^^^^^
[INFO] [stdout] 999 |     pub gold_gained: i32,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `players_in_room` is never used
[INFO] [stdout]   --> src/state.rs:59:12
[INFO] [stdout]    |
[INFO] [stdout] 25 | impl GameState {
[INFO] [stdout]    | -------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 59 |     pub fn players_in_room(&self, room_id: &str, exclude_id: &str) -> Vec<String> {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:121:47
[INFO] [stdout]     |
[INFO] [stdout] 121 |                 let _ = tx.send(Message::Text(event.payload.into()));
[INFO] [stdout]     |                                               ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: `#[deny(self_type_conversion)]` on by default
[INFO] [stdout] help: consider removing the conversion call
[INFO] [stdout]     |
[INFO] [stdout] 121 -                 let _ = tx.send(Message::Text(event.payload.into()));
[INFO] [stdout] 121 +                 let _ = tx.send(Message::Text(event.payload));
[INFO] [stdout]     |
[INFO] [stdout] help: you can use the fully-qualified path to avoid triggering this lint
[INFO] [stdout]     |
[INFO] [stdout] 121 -                 let _ = tx.send(Message::Text(event.payload.into()));
[INFO] [stdout] 121 +                 let _ = tx.send(Message::Text(<std::string::String as Into<_>>::into(event.payload)));
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |       macro_rules! send {
[INFO] [stdout] 138 |           ($text:expr) => {
[INFO] [stdout] 139 |               let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                             ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 145 | /     send!(msg("system",
[INFO] [stdout] 146 | |         "══════════════════════════════\n歡迎來到【遠古傳說】文字 RPG\n══════════════════════════════\n請輸入你的角色名稱登入："
[INFO] [stdout] 147 | |     ));
[INFO] [stdout]     | |______- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 165 |                 if logged_in { send!(msg("error", "你已經登入了。")); continue; }
[INFO] [stdout]     |                                ------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 168 |                     send!(msg("error", "名字長度需在 1~16 字之間。")); continue;
[INFO] [stdout]     |                     ------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 175 |                         send!(msg("error", "此帳號已在線上，請稍後再試。")); continue;
[INFO] [stdout]     |                         --------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 179 |                 send!(msg_val("check", serde_json::json!({ "exists": exists, "name": name })));
[INFO] [stdout]     |                 ------------------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 184 |                 if logged_in { send!(msg("error", "你已經登入了。")); continue; }
[INFO] [stdout]     |                                ------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 187 |                     send!(msg("error", "名字長度需在 1~16 字之間。")); continue;
[INFO] [stdout]     |                     ------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 190 |                     send!(msg("error", "密碼至少需要 4 個字元。")); continue;
[INFO] [stdout]     |                     ---------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 193 |                     send!(msg("error", "此名字已被使用，請換一個。")); continue;
[INFO] [stdout]     |                     ------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 199 |                         send!(msg("error", "此帳號已在線上。")); continue;
[INFO] [stdout]     |                         --------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 213 |                 send!(msg_val("session", serde_json::json!({ "token": token, "name": name })));
[INFO] [stdout]     |                 ------------------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 214 |                 send!(msg("system", &format!("歡迎，{}！帳號建立成功。輸入 help 查看指令。\n", name)));
[INFO] [stdout]     |                 -------------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 217 |                 send!(build_look(&state.game, &player_id).await);
[INFO] [stdout]     |                 ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 222 |                 if logged_in { send!(msg("error", "你已經登入了。")); continue; }
[INFO] [stdout]     |                                ------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 225 |                     send!(msg("error", "帳號不存在，請先註冊。")); continue;
[INFO] [stdout]     |                     --------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 229 |                     send!(msg("error", "密碼錯誤，請再試一次。")); continue;
[INFO] [stdout]     |                     --------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 235 |                         send!(msg("error", "此帳號已在線上。")); continue;
[INFO] [stdout]     |                         --------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 245 |                 send!(msg_val("session", serde_json::json!({ "token": token, "name": name })));
[INFO] [stdout]     |                 ------------------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 251 |                 send!(msg("system", &welcome));
[INFO] [stdout]     |                 ------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 254 |                 send!(build_look(&state.game, &player_id).await);
[INFO] [stdout]     |                 ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 263 |                     send!(msg_val("session_invalid", serde_json::json!({})));
[INFO] [stdout]     |                     -------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 268 |                     send!(msg_val("session_invalid", serde_json::json!({})));
[INFO] [stdout]     |                     -------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 275 |                         send!(msg("error", "此帳號已在線上。")); continue;
[INFO] [stdout]     |                         --------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 285 |                 send!(msg_val("session", serde_json::json!({ "token": new_token, "name": name })));
[INFO] [stdout]     |                 ---------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 291 |                 send!(msg("system", &welcome));
[INFO] [stdout]     |                 ------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 294 |                 send!(build_look(&state.game, &player_id).await);
[INFO] [stdout]     |                 ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 299 |                 if !logged_in { send!(msg("error", "請先登入。")); continue; }
[INFO] [stdout]     |                                 --------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 306 |                         send!(build_look(&state.game, &player_id).await);
[INFO] [stdout]     |                         ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 314 |                         if arg.is_empty() { send!(msg("error", "說什麼？")); continue; }
[INFO] [stdout]     |                                             ------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 321 |                         send!(chat.clone());
[INFO] [stdout]     |                         ------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 325 |                         if arg.is_empty() { send!(msg("error", "喊什麼？")); continue; }
[INFO] [stdout]     |                                             ------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 331 |                         send!(chat.clone());
[INFO] [stdout]     |                         ------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 341 |                         send!(build_stats(&state.game, &player_id).await);
[INFO] [stdout]     |                         ------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 344 |                         send!(build_inventory(&state.game, &player_id).await);
[INFO] [stdout]     |                         ----------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 374 |                         send!(build_shop(&state.game, &player_id).await);
[INFO] [stdout]     |                         ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 394 |                         send!(build_map(&state.game, &player_id).await);
[INFO] [stdout]     |                         ----------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 397 |                         send!(msg("system", HELP_TEXT));
[INFO] [stdout]     |                         ------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 400 |                         send!(msg("error", &format!("不認識的指令：{}。輸入 help 查看指令。", cmd)));
[INFO] [stdout]     |                         ---------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 621 |         None => { send!(msg("error", "不認識的方向，請用 北/南/東/西 或 N/S/E/W。")); return; }
[INFO] [stdout]     |                   ------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 627 |             drop(gs); send!(msg("error", "正在戰鬥中，打敗怪物後才能移動！")); return;
[INFO] [stdout]     |                       ------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 632 |             None => { drop(gs); send!(msg("error", "那個方向沒有出口。")); return; }
[INFO] [stdout]     |                                 ----------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 782 |             send!(msg("combat", &combat_lines.join("\n")));
[INFO] [stdout]     |             ---------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 785 |             send!(msg("system", &tmsg));
[INFO] [stdout]     |             --------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 808 |     send!(build_look(&state.game, player_id).await);
[INFO] [stdout]     |     ----------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:813:70
[INFO] [stdout]     |
[INFO] [stdout] 813 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 825 |         None => { drop(gs); send!(msg("error", "找不到該物品。")); return; }
[INFO] [stdout]     |                             ------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:813:70
[INFO] [stdout]     |
[INFO] [stdout] 813 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 873 |     send!(msg("system", &format!("撿起了「{}」。", item_name)));
[INFO] [stdout]     |     ----------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:813:70
[INFO] [stdout]     |
[INFO] [stdout] 813 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 876 | /         send!(msg("combat", &format!("🗡 趁你撿東西時，「{}」偷襲了你，造成 {} 點傷害！（HP {}/{}）",
[INFO] [stdout] 877 | |             mname, dmg, hp_now, max_hp)));
[INFO] [stdout]     | |_________________________________________- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:813:70
[INFO] [stdout]     |
[INFO] [stdout] 813 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 879 |             send!(msg("combat", "💀 你倒下了……重新甦醒於新手村，HP/MP 回復一半。"));
[INFO] [stdout]     |             ----------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:886:70
[INFO] [stdout]     |
[INFO] [stdout] 886 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 892 |         None => { drop(gs); send!(msg("error", "背包裡沒有該物品。")); }
[INFO] [stdout]     |                             ----------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:886:70
[INFO] [stdout]     |
[INFO] [stdout] 886 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 901 |                     send!(msg("system", &format!("使用「{}」，回復了 {} HP。", item.name, heal)));
[INFO] [stdout]     |                     ----------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:886:70
[INFO] [stdout]     |
[INFO] [stdout] 886 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 903 |                 _ => { drop(gs); send!(msg("error", "這個物品不能直接使用，請用 equip 裝備。")); }
[INFO] [stdout]     |                                  -------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:911:70
[INFO] [stdout]     |
[INFO] [stdout] 911 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 917 |         None => { drop(gs); send!(msg("error", "背包裡沒有該物品。")); }
[INFO] [stdout]     |                             ----------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:911:70
[INFO] [stdout]     |
[INFO] [stdout] 911 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 934 |             send!(msg("system", &result));
[INFO] [stdout]     |             ----------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:941:70
[INFO] [stdout]     |
[INFO] [stdout] 941 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 965 |             send!(msg("system", "怪物已被消滅！戰鬥結束。"));
[INFO] [stdout]     |             ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:941:70
[INFO] [stdout]      |
[INFO] [stdout]  941 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1010 |             send!(msg("combat", &all_lines.join("\n")));
[INFO] [stdout]      |             ------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1033 |             send!(msg("system", "你還沒有任何技能（1 級可學重擊）。"));
[INFO] [stdout]      |             ---------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1042 |         send!(msg("system", &format!("━━ 可用技能 ━━\n{}\n輸入：skill 技能名稱 使用", lines.join("\n"))));
[INFO] [stdout]      |         ------------------------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1048 |         None => { send!(msg("error", "不認識的技能名稱。輸入 skill 查看技能列表。")); return; }
[INFO] [stdout]      |                   ------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1057 |             send!(msg("error", &format!("「{}」需要 {} 等級才能使用。", skill.display(), skill.unlock_level())));
[INFO] [stdout]      |             ---------------------------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1063 | /             send!(msg("error", &format!("「{}」還在冷卻中，請等 {} 回合。", skill.display(), {
[INFO] [stdout] 1064 | |                 let gs2 = state.game.read().await;
[INFO] [stdout] 1065 | |                 gs2.players.get(player_id).unwrap().skill_cd(&skill)
[INFO] [stdout] 1066 | |             })));
[INFO] [stdout]      | |________________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1072 | /             send!(msg("error", &format!("MP 不足！「{}」需要 {} MP，目前只有 {} MP。",
[INFO] [stdout] 1073 | |                 skill.display(), skill.mp_cost(), {
[INFO] [stdout] 1074 | |                     let gs2 = state.game.read().await;
[INFO] [stdout] 1075 | |                     gs2.players.get(player_id).unwrap().mp
[INFO] [stdout] 1076 | |                 }))); return;
[INFO] [stdout]      | |____________________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1081 |             send!(msg("error", "你沒有在戰鬥中！先用 attack 攻擊怪物。"));
[INFO] [stdout]      |             ------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1108:70
[INFO] [stdout]      |
[INFO] [stdout] 1108 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1113 |         drop(gs); send!(msg("error", "你沒有在戰鬥中！")); return;
[INFO] [stdout]      |                   --------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1108:70
[INFO] [stdout]      |
[INFO] [stdout] 1108 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1116 |         drop(gs); send!(msg("system", "你已經在防禦姿態了。")); return;
[INFO] [stdout]      |                   -------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1108:70
[INFO] [stdout]      |
[INFO] [stdout] 1108 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1133 | /     send!(msg("combat", &format!(
[INFO] [stdout] 1134 | |         "🛡 進入防禦姿態！下次受傷減少 60%、下次攻擊+30%。{}",
[INFO] [stdout] 1135 | |         heal_msg
[INFO] [stdout] 1136 | |     )));
[INFO] [stdout]      | |_______- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1141:70
[INFO] [stdout]      |
[INFO] [stdout] 1141 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1146 |         drop(gs); send!(msg("error", "你沒有在戰鬥中！")); return;
[INFO] [stdout]      |                   --------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1141:70
[INFO] [stdout]      |
[INFO] [stdout] 1141 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1158 |             drop(gs); send!(msg("system", "怪物已消失，戰鬥結束。")); return;
[INFO] [stdout]      |                       ---------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1141:70
[INFO] [stdout]      |
[INFO] [stdout] 1141 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1173 |         send!(msg("combat", &msg_text));
[INFO] [stdout]      |         ------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1141:70
[INFO] [stdout]      |
[INFO] [stdout] 1141 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1175 | /         send!(msg("combat", &format!(
[INFO] [stdout] 1176 | |             "❌ 逃跑失敗！「{}」補了一刀，造成 {} 點傷害！", monster.name, result.damage_taken
[INFO] [stdout] 1177 | |         )));
[INFO] [stdout]      | |___________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1141:70
[INFO] [stdout]      |
[INFO] [stdout] 1141 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1188 |             send!(msg("combat", "💀 你倒下了！復活於新手村，HP 恢復一半…"));
[INFO] [stdout]      |             --------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1195:70
[INFO] [stdout]      |
[INFO] [stdout] 1195 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1206 |             send!(msg("error", "這裡沒有旅館。（前往新手村休息）"));
[INFO] [stdout]      |             ------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1195:70
[INFO] [stdout]      |
[INFO] [stdout] 1195 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1215 |         send!(msg("error", "戰鬥中無法休息！"));
[INFO] [stdout]      |         --------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1195:70
[INFO] [stdout]      |
[INFO] [stdout] 1195 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1227 |         send!(msg("error", &format!("金幣不足！休息需要 {} 金幣，你只有 {} 金幣。", price, have)));
[INFO] [stdout]      |         ------------------------------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1195:70
[INFO] [stdout]      |
[INFO] [stdout] 1195 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1244 | /     send!(msg("system", &format!(
[INFO] [stdout] 1245 | |         "🛏 旅館老闆說：「{}」\n花費 {} 金幣，HP 與 MP 完全恢復！\n  HP：{}/{}　MP：{}/{}　剩餘金幣：{}",
[INFO] [stdout] 1246 | |         inn_greeting, price, max_hp, max_hp, max_mp, max_mp, gold_left
[INFO] [stdout] 1247 | |     )));
[INFO] [stdout]      | |_______- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1268 |                     send!(msg("error", "新手村是所有冒險者的起點，無法購買。"));
[INFO] [stdout]      |                     ----------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1274 |         None => { drop(gs); send!(msg("error", "找不到房間。")); return; }
[INFO] [stdout]      |                             ----------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1280 | /             send!(msg("system", &format!(
[INFO] [stdout] 1281 | |                 "🏴 這已經是你的領地！（過路費 {} 金幣，dist={}）",
[INFO] [stdout] 1282 | |                 room_toll(price), dist
[INFO] [stdout] 1283 | |             )));
[INFO] [stdout]      | |_______________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1289 |             send!(msg("error", &format!("「{}」已是「{}」的領地，無法奪取。", room_name, o2)));
[INFO] [stdout]      |             ---------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1297 | /         send!(msg("error", &format!(
[INFO] [stdout] 1298 | |             "金幣不足！購買「{}」需要 {} 金幣，你只有 {} 金幣。", room_name, price, player_gold
[INFO] [stdout] 1299 | |         )));
[INFO] [stdout]      | |___________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1314 | /     send!(msg("system", &format!(
[INFO] [stdout] 1315 | |         "🏴 成功購入「{}」！花費 {} 金幣，剩 {} 金幣。\n  ✓ 此地怪物不再攻擊你\n  ✓ 過路者須繳納 {} 金幣過路費",
[INFO] [stdout] 1316 | |         room_name, price, gold_left, room_toll(price)
[INFO] [stdout] 1317 | |     )));
[INFO] [stdout]      | |_______- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1360 |         send!(msg("error", "請指定商品編號或名稱，例如：buy 1 或 buy 藥水"));
[INFO] [stdout]      |         -------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1371 |             None => { drop(gs); send!(msg("system", "這裡沒有商人。")); return; }
[INFO] [stdout]      |                                 -------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1377 |                         send!(msg("error", &format!("無效的編號，請輸入 1~{}。", max)));
[INFO] [stdout]      |                         --------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1386 |                             send!(msg("error", "找不到該商品，輸入 shop 查看商品列表。"));
[INFO] [stdout]      |                             ------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1400 |         send!(msg("error", &format!("金幣不足！需要 {} 金幣，你只有 {} 金幣。", need, have)));
[INFO] [stdout]      |         ------------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1412 | /     send!(msg("system", &format!(
[INFO] [stdout] 1413 | |         "💰 購買了「{}」！花費 {} 金幣，剩餘 {} 金幣。", item_name, spent, gold_left
[INFO] [stdout] 1414 | |     )));
[INFO] [stdout]      | |_______- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1428 |             send!(msg("system", "這裡沒有商人，無法出售物品。"));
[INFO] [stdout]      |             ---------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1433 |             send!(msg("system", "背包是空的，沒有可出售的物品。"));
[INFO] [stdout]      |             ------------------------------------------------------ in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1440 | /         send!(msg("shop", &format!(
[INFO] [stdout] 1441 | |             "━━ 出售清單 ━━\n{}\n\n輸入 sell [物品名或編號] 出售", lines.join("\n")
[INFO] [stdout] 1442 | |         )));
[INFO] [stdout]      | |___________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1452 |         send!(msg("system", "這裡沒有商人，無法出售物品。"));
[INFO] [stdout]      |         ---------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1463 |             send!(msg("error", &format!("無效的編號，請輸入 1~{}。", max)));
[INFO] [stdout]      |             --------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1472 |                 send!(msg("error", "背包裡沒有該物品。"));
[INFO] [stdout]      |                 ----------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1485 | /     send!(msg("system", &format!(
[INFO] [stdout] 1486 | |         "💰 出售了「{}」，獲得 {} 金幣！現有 {} 金幣。", item_name, sell_price, gold_now
[INFO] [stdout] 1487 | |     )));
[INFO] [stdout]      | |_______- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] error: could not compile `rpg-server` (bin "rpg-server") due to 94 previous errors; 3 warnings emitted
[INFO] [stderr] warning: build failed, waiting for other jobs to finish...
[INFO] [stdout] warning: unused variable: `mname`
[INFO] [stdout]    --> src/main.rs:851:36
[INFO] [stdout]     |
[INFO] [stdout] 851 |     let player_died = if let Some((mname, dmg)) = &monster_atk {
[INFO] [stdout]     |                                    ^^^^^ help: if this is intentional, prefix it with an underscore: `_mname`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `player_leveled`, `exp_gained`, and `gold_gained` are never read
[INFO] [stdout]    --> src/game/mod.rs:997:9
[INFO] [stdout]     |
[INFO] [stdout] 994 | pub struct CombatResult {
[INFO] [stdout]     |            ------------ fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 997 |     pub player_leveled: bool,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout] 998 |     pub exp_gained: i32,
[INFO] [stdout]     |         ^^^^^^^^^^
[INFO] [stdout] 999 |     pub gold_gained: i32,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `players_in_room` is never used
[INFO] [stdout]   --> src/state.rs:59:12
[INFO] [stdout]    |
[INFO] [stdout] 25 | impl GameState {
[INFO] [stdout]    | -------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 59 |     pub fn players_in_room(&self, room_id: &str, exclude_id: &str) -> Vec<String> {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:121:47
[INFO] [stdout]     |
[INFO] [stdout] 121 |                 let _ = tx.send(Message::Text(event.payload.into()));
[INFO] [stdout]     |                                               ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: `#[deny(self_type_conversion)]` on by default
[INFO] [stdout] help: consider removing the conversion call
[INFO] [stdout]     |
[INFO] [stdout] 121 -                 let _ = tx.send(Message::Text(event.payload.into()));
[INFO] [stdout] 121 +                 let _ = tx.send(Message::Text(event.payload));
[INFO] [stdout]     |
[INFO] [stdout] help: you can use the fully-qualified path to avoid triggering this lint
[INFO] [stdout]     |
[INFO] [stdout] 121 -                 let _ = tx.send(Message::Text(event.payload.into()));
[INFO] [stdout] 121 +                 let _ = tx.send(Message::Text(<std::string::String as Into<_>>::into(event.payload)));
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |       macro_rules! send {
[INFO] [stdout] 138 |           ($text:expr) => {
[INFO] [stdout] 139 |               let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                             ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 145 | /     send!(msg("system",
[INFO] [stdout] 146 | |         "══════════════════════════════\n歡迎來到【遠古傳說】文字 RPG\n══════════════════════════════\n請輸入你的角色名稱登入："
[INFO] [stdout] 147 | |     ));
[INFO] [stdout]     | |______- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 165 |                 if logged_in { send!(msg("error", "你已經登入了。")); continue; }
[INFO] [stdout]     |                                ------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 168 |                     send!(msg("error", "名字長度需在 1~16 字之間。")); continue;
[INFO] [stdout]     |                     ------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 175 |                         send!(msg("error", "此帳號已在線上，請稍後再試。")); continue;
[INFO] [stdout]     |                         --------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 179 |                 send!(msg_val("check", serde_json::json!({ "exists": exists, "name": name })));
[INFO] [stdout]     |                 ------------------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 184 |                 if logged_in { send!(msg("error", "你已經登入了。")); continue; }
[INFO] [stdout]     |                                ------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 187 |                     send!(msg("error", "名字長度需在 1~16 字之間。")); continue;
[INFO] [stdout]     |                     ------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 190 |                     send!(msg("error", "密碼至少需要 4 個字元。")); continue;
[INFO] [stdout]     |                     ---------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 193 |                     send!(msg("error", "此名字已被使用，請換一個。")); continue;
[INFO] [stdout]     |                     ------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 199 |                         send!(msg("error", "此帳號已在線上。")); continue;
[INFO] [stdout]     |                         --------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 213 |                 send!(msg_val("session", serde_json::json!({ "token": token, "name": name })));
[INFO] [stdout]     |                 ------------------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 214 |                 send!(msg("system", &format!("歡迎，{}！帳號建立成功。輸入 help 查看指令。\n", name)));
[INFO] [stdout]     |                 -------------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 217 |                 send!(build_look(&state.game, &player_id).await);
[INFO] [stdout]     |                 ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 222 |                 if logged_in { send!(msg("error", "你已經登入了。")); continue; }
[INFO] [stdout]     |                                ------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 225 |                     send!(msg("error", "帳號不存在，請先註冊。")); continue;
[INFO] [stdout]     |                     --------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 229 |                     send!(msg("error", "密碼錯誤，請再試一次。")); continue;
[INFO] [stdout]     |                     --------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 235 |                         send!(msg("error", "此帳號已在線上。")); continue;
[INFO] [stdout]     |                         --------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 245 |                 send!(msg_val("session", serde_json::json!({ "token": token, "name": name })));
[INFO] [stdout]     |                 ------------------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 251 |                 send!(msg("system", &welcome));
[INFO] [stdout]     |                 ------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 254 |                 send!(build_look(&state.game, &player_id).await);
[INFO] [stdout]     |                 ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 263 |                     send!(msg_val("session_invalid", serde_json::json!({})));
[INFO] [stdout]     |                     -------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 268 |                     send!(msg_val("session_invalid", serde_json::json!({})));
[INFO] [stdout]     |                     -------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 275 |                         send!(msg("error", "此帳號已在線上。")); continue;
[INFO] [stdout]     |                         --------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 285 |                 send!(msg_val("session", serde_json::json!({ "token": new_token, "name": name })));
[INFO] [stdout]     |                 ---------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 291 |                 send!(msg("system", &welcome));
[INFO] [stdout]     |                 ------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 294 |                 send!(build_look(&state.game, &player_id).await);
[INFO] [stdout]     |                 ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 299 |                 if !logged_in { send!(msg("error", "請先登入。")); continue; }
[INFO] [stdout]     |                                 --------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 306 |                         send!(build_look(&state.game, &player_id).await);
[INFO] [stdout]     |                         ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 314 |                         if arg.is_empty() { send!(msg("error", "說什麼？")); continue; }
[INFO] [stdout]     |                                             ------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 321 |                         send!(chat.clone());
[INFO] [stdout]     |                         ------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 325 |                         if arg.is_empty() { send!(msg("error", "喊什麼？")); continue; }
[INFO] [stdout]     |                                             ------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 331 |                         send!(chat.clone());
[INFO] [stdout]     |                         ------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 341 |                         send!(build_stats(&state.game, &player_id).await);
[INFO] [stdout]     |                         ------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 344 |                         send!(build_inventory(&state.game, &player_id).await);
[INFO] [stdout]     |                         ----------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 374 |                         send!(build_shop(&state.game, &player_id).await);
[INFO] [stdout]     |                         ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 394 |                         send!(build_map(&state.game, &player_id).await);
[INFO] [stdout]     |                         ----------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 397 |                         send!(msg("system", HELP_TEXT));
[INFO] [stdout]     |                         ------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:139:43
[INFO] [stdout]     |
[INFO] [stdout] 137 |     macro_rules! send {
[INFO] [stdout] 138 |         ($text:expr) => {
[INFO] [stdout] 139 |             let _ = tx.send(Message::Text(($text).into()));
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 400 |                         send!(msg("error", &format!("不認識的指令：{}。輸入 help 查看指令。", cmd)));
[INFO] [stdout]     |                         ---------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 621 |         None => { send!(msg("error", "不認識的方向，請用 北/南/東/西 或 N/S/E/W。")); return; }
[INFO] [stdout]     |                   ------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 627 |             drop(gs); send!(msg("error", "正在戰鬥中，打敗怪物後才能移動！")); return;
[INFO] [stdout]     |                       ------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 632 |             None => { drop(gs); send!(msg("error", "那個方向沒有出口。")); return; }
[INFO] [stdout]     |                                 ----------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 782 |             send!(msg("combat", &combat_lines.join("\n")));
[INFO] [stdout]     |             ---------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 785 |             send!(msg("system", &tmsg));
[INFO] [stdout]     |             --------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:617:70
[INFO] [stdout]     |
[INFO] [stdout] 617 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 808 |     send!(build_look(&state.game, player_id).await);
[INFO] [stdout]     |     ----------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:813:70
[INFO] [stdout]     |
[INFO] [stdout] 813 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 825 |         None => { drop(gs); send!(msg("error", "找不到該物品。")); return; }
[INFO] [stdout]     |                             ------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:813:70
[INFO] [stdout]     |
[INFO] [stdout] 813 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 873 |     send!(msg("system", &format!("撿起了「{}」。", item_name)));
[INFO] [stdout]     |     ----------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:813:70
[INFO] [stdout]     |
[INFO] [stdout] 813 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 876 | /         send!(msg("combat", &format!("🗡 趁你撿東西時，「{}」偷襲了你，造成 {} 點傷害！（HP {}/{}）",
[INFO] [stdout] 877 | |             mname, dmg, hp_now, max_hp)));
[INFO] [stdout]     | |_________________________________________- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:813:70
[INFO] [stdout]     |
[INFO] [stdout] 813 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 879 |             send!(msg("combat", "💀 你倒下了……重新甦醒於新手村，HP/MP 回復一半。"));
[INFO] [stdout]     |             ----------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:886:70
[INFO] [stdout]     |
[INFO] [stdout] 886 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 892 |         None => { drop(gs); send!(msg("error", "背包裡沒有該物品。")); }
[INFO] [stdout]     |                             ----------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:886:70
[INFO] [stdout]     |
[INFO] [stdout] 886 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 901 |                     send!(msg("system", &format!("使用「{}」，回復了 {} HP。", item.name, heal)));
[INFO] [stdout]     |                     ----------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:886:70
[INFO] [stdout]     |
[INFO] [stdout] 886 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 903 |                 _ => { drop(gs); send!(msg("error", "這個物品不能直接使用，請用 equip 裝備。")); }
[INFO] [stdout]     |                                  -------------------------------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:911:70
[INFO] [stdout]     |
[INFO] [stdout] 911 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 917 |         None => { drop(gs); send!(msg("error", "背包裡沒有該物品。")); }
[INFO] [stdout]     |                             ----------------------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:911:70
[INFO] [stdout]     |
[INFO] [stdout] 911 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 934 |             send!(msg("system", &result));
[INFO] [stdout]     |             ----------------------------- in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/main.rs:941:70
[INFO] [stdout]     |
[INFO] [stdout] 941 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]     |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 965 |             send!(msg("system", "怪物已被消滅！戰鬥結束。"));
[INFO] [stdout]     |             ------------------------------------------------ in this macro invocation
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:941:70
[INFO] [stdout]      |
[INFO] [stdout]  941 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1010 |             send!(msg("combat", &all_lines.join("\n")));
[INFO] [stdout]      |             ------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1033 |             send!(msg("system", "你還沒有任何技能（1 級可學重擊）。"));
[INFO] [stdout]      |             ---------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1042 |         send!(msg("system", &format!("━━ 可用技能 ━━\n{}\n輸入：skill 技能名稱 使用", lines.join("\n"))));
[INFO] [stdout]      |         ------------------------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1048 |         None => { send!(msg("error", "不認識的技能名稱。輸入 skill 查看技能列表。")); return; }
[INFO] [stdout]      |                   ------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1057 |             send!(msg("error", &format!("「{}」需要 {} 等級才能使用。", skill.display(), skill.unlock_level())));
[INFO] [stdout]      |             ---------------------------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1063 | /             send!(msg("error", &format!("「{}」還在冷卻中，請等 {} 回合。", skill.display(), {
[INFO] [stdout] 1064 | |                 let gs2 = state.game.read().await;
[INFO] [stdout] 1065 | |                 gs2.players.get(player_id).unwrap().skill_cd(&skill)
[INFO] [stdout] 1066 | |             })));
[INFO] [stdout]      | |________________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1072 | /             send!(msg("error", &format!("MP 不足！「{}」需要 {} MP，目前只有 {} MP。",
[INFO] [stdout] 1073 | |                 skill.display(), skill.mp_cost(), {
[INFO] [stdout] 1074 | |                     let gs2 = state.game.read().await;
[INFO] [stdout] 1075 | |                     gs2.players.get(player_id).unwrap().mp
[INFO] [stdout] 1076 | |                 }))); return;
[INFO] [stdout]      | |____________________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1025:70
[INFO] [stdout]      |
[INFO] [stdout] 1025 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1081 |             send!(msg("error", "你沒有在戰鬥中！先用 attack 攻擊怪物。"));
[INFO] [stdout]      |             ------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1108:70
[INFO] [stdout]      |
[INFO] [stdout] 1108 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1113 |         drop(gs); send!(msg("error", "你沒有在戰鬥中！")); return;
[INFO] [stdout]      |                   --------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1108:70
[INFO] [stdout]      |
[INFO] [stdout] 1108 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1116 |         drop(gs); send!(msg("system", "你已經在防禦姿態了。")); return;
[INFO] [stdout]      |                   -------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1108:70
[INFO] [stdout]      |
[INFO] [stdout] 1108 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1133 | /     send!(msg("combat", &format!(
[INFO] [stdout] 1134 | |         "🛡 進入防禦姿態！下次受傷減少 60%、下次攻擊+30%。{}",
[INFO] [stdout] 1135 | |         heal_msg
[INFO] [stdout] 1136 | |     )));
[INFO] [stdout]      | |_______- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1141:70
[INFO] [stdout]      |
[INFO] [stdout] 1141 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1146 |         drop(gs); send!(msg("error", "你沒有在戰鬥中！")); return;
[INFO] [stdout]      |                   --------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1141:70
[INFO] [stdout]      |
[INFO] [stdout] 1141 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1158 |             drop(gs); send!(msg("system", "怪物已消失，戰鬥結束。")); return;
[INFO] [stdout]      |                       ---------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1141:70
[INFO] [stdout]      |
[INFO] [stdout] 1141 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1173 |         send!(msg("combat", &msg_text));
[INFO] [stdout]      |         ------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1141:70
[INFO] [stdout]      |
[INFO] [stdout] 1141 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1175 | /         send!(msg("combat", &format!(
[INFO] [stdout] 1176 | |             "❌ 逃跑失敗！「{}」補了一刀，造成 {} 點傷害！", monster.name, result.damage_taken
[INFO] [stdout] 1177 | |         )));
[INFO] [stdout]      | |___________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1141:70
[INFO] [stdout]      |
[INFO] [stdout] 1141 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1188 |             send!(msg("combat", "💀 你倒下了！復活於新手村，HP 恢復一半…"));
[INFO] [stdout]      |             --------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1195:70
[INFO] [stdout]      |
[INFO] [stdout] 1195 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1206 |             send!(msg("error", "這裡沒有旅館。（前往新手村休息）"));
[INFO] [stdout]      |             ------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1195:70
[INFO] [stdout]      |
[INFO] [stdout] 1195 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1215 |         send!(msg("error", "戰鬥中無法休息！"));
[INFO] [stdout]      |         --------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1195:70
[INFO] [stdout]      |
[INFO] [stdout] 1195 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1227 |         send!(msg("error", &format!("金幣不足！休息需要 {} 金幣，你只有 {} 金幣。", price, have)));
[INFO] [stdout]      |         ------------------------------------------------------------------------------------------ in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1195:70
[INFO] [stdout]      |
[INFO] [stdout] 1195 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1244 | /     send!(msg("system", &format!(
[INFO] [stdout] 1245 | |         "🛏 旅館老闆說：「{}」\n花費 {} 金幣，HP 與 MP 完全恢復！\n  HP：{}/{}　MP：{}/{}　剩餘金幣：{}",
[INFO] [stdout] 1246 | |         inn_greeting, price, max_hp, max_hp, max_mp, max_mp, gold_left
[INFO] [stdout] 1247 | |     )));
[INFO] [stdout]      | |_______- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1268 |                     send!(msg("error", "新手村是所有冒險者的起點，無法購買。"));
[INFO] [stdout]      |                     ----------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1274 |         None => { drop(gs); send!(msg("error", "找不到房間。")); return; }
[INFO] [stdout]      |                             ----------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1280 | /             send!(msg("system", &format!(
[INFO] [stdout] 1281 | |                 "🏴 這已經是你的領地！（過路費 {} 金幣，dist={}）",
[INFO] [stdout] 1282 | |                 room_toll(price), dist
[INFO] [stdout] 1283 | |             )));
[INFO] [stdout]      | |_______________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1289 |             send!(msg("error", &format!("「{}」已是「{}」的領地，無法奪取。", room_name, o2)));
[INFO] [stdout]      |             ---------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1297 | /         send!(msg("error", &format!(
[INFO] [stdout] 1298 | |             "金幣不足！購買「{}」需要 {} 金幣，你只有 {} 金幣。", room_name, price, player_gold
[INFO] [stdout] 1299 | |         )));
[INFO] [stdout]      | |___________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1252:70
[INFO] [stdout]      |
[INFO] [stdout] 1252 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1314 | /     send!(msg("system", &format!(
[INFO] [stdout] 1315 | |         "🏴 成功購入「{}」！花費 {} 金幣，剩 {} 金幣。\n  ✓ 此地怪物不再攻擊你\n  ✓ 過路者須繳納 {} 金幣過路費",
[INFO] [stdout] 1316 | |         room_name, price, gold_left, room_toll(price)
[INFO] [stdout] 1317 | |     )));
[INFO] [stdout]      | |_______- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1360 |         send!(msg("error", "請指定商品編號或名稱，例如：buy 1 或 buy 藥水"));
[INFO] [stdout]      |         -------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1371 |             None => { drop(gs); send!(msg("system", "這裡沒有商人。")); return; }
[INFO] [stdout]      |                                 -------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1377 |                         send!(msg("error", &format!("無效的編號，請輸入 1~{}。", max)));
[INFO] [stdout]      |                         --------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1386 |                             send!(msg("error", "找不到該商品，輸入 shop 查看商品列表。"));
[INFO] [stdout]      |                             ------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1400 |         send!(msg("error", &format!("金幣不足！需要 {} 金幣，你只有 {} 金幣。", need, have)));
[INFO] [stdout]      |         ------------------------------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1357:70
[INFO] [stdout]      |
[INFO] [stdout] 1357 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1412 | /     send!(msg("system", &format!(
[INFO] [stdout] 1413 | |         "💰 購買了「{}」！花費 {} 金幣，剩餘 {} 金幣。", item_name, spent, gold_left
[INFO] [stdout] 1414 | |     )));
[INFO] [stdout]      | |_______- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1428 |             send!(msg("system", "這裡沒有商人，無法出售物品。"));
[INFO] [stdout]      |             ---------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1433 |             send!(msg("system", "背包是空的，沒有可出售的物品。"));
[INFO] [stdout]      |             ------------------------------------------------------ in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1440 | /         send!(msg("shop", &format!(
[INFO] [stdout] 1441 | |             "━━ 出售清單 ━━\n{}\n\n輸入 sell [物品名或編號] 出售", lines.join("\n")
[INFO] [stdout] 1442 | |         )));
[INFO] [stdout]      | |___________- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1452 |         send!(msg("system", "這裡沒有商人，無法出售物品。"));
[INFO] [stdout]      |         ---------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1463 |             send!(msg("error", &format!("無效的編號，請輸入 1~{}。", max)));
[INFO] [stdout]      |             --------------------------------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |     macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1472 |                 send!(msg("error", "背包裡沒有該物品。"));
[INFO] [stdout]      |                 ----------------------------------------- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]     --> src/main.rs:1419:70
[INFO] [stdout]      |
[INFO] [stdout] 1419 |       macro_rules! send { ($t:expr) => { let _ = tx.send(Message::Text(($t).into())); }; }
[INFO] [stdout]      |                                                                        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1485 | /     send!(msg("system", &format!(
[INFO] [stdout] 1486 | |         "💰 出售了「{}」，獲得 {} 金幣！現有 {} 金幣。", item_name, sell_price, gold_now
[INFO] [stdout] 1487 | |     )));
[INFO] [stdout]      | |_______- in this macro invocation
[INFO] [stdout]      |
[INFO] [stdout]      = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]      = note: you can instead use the fully-qualified path `<std::string::String as Into<std::string::String>::into(val) to avoid triggering this lint
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] error: could not compile `rpg-server` (bin "rpg-server" test) due to 94 previous errors; 3 warnings emitted
[INFO] running `Command { std: "docker" "inspect" "edacbf07ad96b109a3bd72720f516d08f1a5b45be80019082919a46f9c2da290", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "edacbf07ad96b109a3bd72720f516d08f1a5b45be80019082919a46f9c2da290", kill_on_drop: false }`
[INFO] [stdout] edacbf07ad96b109a3bd72720f516d08f1a5b45be80019082919a46f9c2da290
