Rust序列化和反序列化toml

3wabscal  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(168)

我从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");
}

Playground .

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",
            ),
        ),
    },
)

我错过了什么?不支持带值的枚举吗?

uttx8gqw

uttx8gqw1#

如果你想反序列化成一个enum,你必须提供一个表,而不是一个数组:

[[list]]
host = "127.0.0.1:8080"
[list.server_options.Static]
dir = "somedir"
error_page = "error.html"
entry_point = "index.html"

至于序列化,你不能使用toml序列化enum
注意,TOML格式并不支持Rust中的所有数据类型,比如枚举、元组和元组结构。
docs on Serializer

相关问题