{"record":{"id":"bc6a50e390f18e4f","repo":"shadowsocks/shadowsocks-rust","slug":"invalid-mode","errorCode":null,"errorMessage":"invalid `mode`","messagePattern":"invalid `mode`","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/shadowsocks-service/src/config.rs","lineNumber":1913,"sourceCode":"                                local.local_udp_address,\n                                local_udp_port,\n                                config.ipv6_first.unwrap_or(false),\n                            );\n\n                            local_config.udp_addr = Some(local_udp_addr);\n                        }\n\n                        #[cfg(target_os = \"macos\")]\n                        {\n                            local_config.launchd_tcp_socket_name = local.launchd_tcp_socket_name;\n                            local_config.launchd_udp_socket_name = local.launchd_udp_socket_name;\n                        }\n\n                        match local.mode {\n                            Some(mode) => match mode.parse::<Mode>() {\n                                Ok(mode) => local_config.mode = mode,\n                                Err(..) => {\n                                    let err = Error::new(ErrorKind::Malformed, \"invalid `mode`\", None);\n                                    return Err(err);\n                                }\n                            },\n                            None => {\n                                // DNS server runs in `TcpAndUdp` mode by default to maintain backwards compatibility\n                                // see https://github.com/shadowsocks/shadowsocks-rust/issues/1281\n                                let mode = match protocol {\n                                    #[cfg(feature = \"local-dns\")]\n                                    ProtocolType::Dns => Mode::TcpAndUdp,\n                                    _ => global_mode,\n                                };\n\n                                local_config.mode = mode;\n                            }\n                        }\n\n                        #[cfg(feature = \"local-tunnel\")]\n                        if let Some(forward_address) = local.forward_address {","sourceCodeStart":1895,"sourceCodeEnd":1931,"githubUrl":"https://github.com/shadowsocks/shadowsocks-rust/blob/8eb0f0a65b1d976ab6bed5787327ef86529b0435/crates/shadowsocks-service/src/config.rs#L1895-L1931","documentation":"Raised when a local config entry's `mode` string cannot be parsed into the `Mode` type. Mode controls which relays are enabled (e.g. \"tcp_only\", \"udp_only\", \"tcp_and_udp\"); an unrecognized value is rejected as Malformed instead of silently defaulting.","triggerScenarios":"A `local` entry contains `mode` set to a string not accepted by Mode::from_str, e.g. `\"both\"`, `\"TCP\"`, `\"tcp-only\"` (hyphen instead of underscore), or a typo.","commonSituations":"Configs copied from other tools with different mode vocabularies; case-sensitivity mistakes; older configs using removed mode names after an upgrade.","solutions":["Use an exact accepted Mode value: \"tcp_only\", \"udp_only\", or \"tcp_and_udp\" (verify against the Mode enum in your version).","Remove the `mode` field to inherit the default (TCP-only normally; TCP-and-UDP for local-dns).","Normalize case — values are matched exactly, e.g. \"TCP_ONLY\" may not parse."],"exampleFix":"// before\n{ \"mode\": \"tcp-only\" }\n// after\n{ \"mode\": \"tcp_only\" }","handlingStrategy":"validation","validationCode":"const MODES: [&str; 3] = [\"tcp_only\", \"udp_only\", \"tcp_and_udp\"];\nfn validate_mode(entry: &serde_json::Value) -> Result<(), String> {\n    if let Some(m) = entry.get(\"mode\") {\n        let s = m.as_str().ok_or(\"mode must be a string\")?;\n        if !MODES.contains(&s) {\n            return Err(format!(\"invalid mode: {s}\"));\n        }\n    }\n    Ok(())\n}","typeGuard":"fn is_valid_mode(s: &str) -> bool {\n    matches!(s, \"tcp_only\" | \"udp_only\" | \"tcp_and_udp\")\n}","tryCatchPattern":"match LocalConfig::load_from(config_path) {\n    Ok(cfg) => start(cfg),\n    Err(e) if e.to_string().contains(\"invalid `mode`\") => {\n        eprintln!(\"Use tcp_only|udp_only|tcp_and_udp: {e}\");\n        std::process::exit(1);\n    }\n    Err(e) => return Err(e.into()),\n}","preventionTips":["Use underscores, not hyphens: tcp_only, not tcp-only.","Keep mode values lowercase and exact per the Mode enum.","Drop the `mode` key to rely on documented defaults instead of guessing values."],"tags":["config","validation","shadowsocks"],"backgroundTag":"invalid-enum-value","analyzedSha":"8eb0f0a65b1d976ab6bed5787327ef86529b0435","analyzedAt":"2026-09-09T12:20:43.168Z","contentChangedAt":"2026-09-09T12:20:43.168Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}