我从serde得到一个非常无用的错误。
无论我做什么,我似乎都不能把这个toml文件放到结构体中。
我的toml文件:
[[list]]
host = "127.0.0.1:8080"
[[list.server_options.Static]]
dir = "somedir"
error_page = "error.html"
entry_point = "index.html"
#[derive(Deserialize, Debug)]
enum ServerOptions {
Static {
dir: Option<String>,
entry_point: Option<String>,
error_page: Option<String>,
},
RevProxy {
proxy_ip: Option<String>,
},
None,
}
#[derive(Deserialize, Debug)]
struct Site {
host: String,
server_options: ServerOptions,
}
#[derive(Deserialize, Debug)]
struct Sites {
list: Vec<Site>,
}
fn main() {
let config_str = std::fs::read_to_string("config.toml")?;
let config: Sites = toml::from_str(&config_str).expect("invalid config");
}
thread 'main' panicked at 'invalid config: Error { inner: Error { inner: TomlError { message: "invalid type: map, expected a string", original: Some("[[list]]\nhost = \"127.0.0.1:8080\"\n[[list.server_options.Static]]\n#dir = \"somedir\"\n#error_page = \"error.html\"\n#entry_point = \"index.html\""), keys: ["list", "server_options"], span: Some(33..63) } } }', src/main.rs:158:55
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
当我把错误传递给anyhow时,我得到以下内容
Error: TOML parse error at line 3, column 1
|
3 | [[list.server_options.Static]]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
invalid type: map, expected a string
当我尝试序列化我的配置时,我得到以下错误返回
Err(
Error {
inner: UnsupportedType(
Some(
"ServerOptions",
),
),
},
)
我错过了什么?不支持带值的枚举吗?
1条答案
按热度按时间uttx8gqw1#
如果你想反序列化成一个
enum
,你必须提供一个表,而不是一个数组:至于序列化,你不能使用
toml
序列化enum
:注意,TOML格式并不支持Rust中的所有数据类型,比如枚举、元组和元组结构。
从docs on
Serializer