【发布时间】:2019-08-12 23:47:16
【问题描述】:
我有一个 JSON API,它返回一个如下所示的对象:
{
"PrivatePort": 2222,
"PublicPort": 3333,
"Type": "tcp"
}
为了捕捉到这一点,我有一个枚举和一个结构:
#[derive(Eq, PartialEq, Deserialize, Serialize, Debug)]
#[serde(rename_all = "snake_case")]
pub enum PortType {
Sctp,
Tcp,
Udp,
}
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "PascalCase")]
pub struct PortMapping {
pub private_port: u16,
pub public_port: u16,
#[serde(rename = "Type")]
pub port_type: PortType,
}
目前,此 API 仅支持 PortType 中列出的三种协议,但我们假设将来会添加对 DCCP 的支持。我不希望 API 的客户端仅仅因为他们可能没有查看的配置选项中的未知字符串而开始失败。
为了解决这个问题,我添加了一个带有String 的Unknown 变体来表示值:
#[derive(Eq, PartialEq, Deserialize, Serialize, Debug)]
#[serde(rename_all = "snake_case")]
pub enum PortType {
Sctp,
Tcp,
Udp,
Unknown(String),
}
这里的目标是在传入未知值时以稍微不方便的PortType::Unknown("dccp") 值结束。当然,这并不能实现我想要的开箱即用——传递未知的@987654329 @值会导致:
Error("unknown variant `dccp`, expected one of `sctp`, `tcp`, `udp`, `unknown`", line: 1, column: 55)
是否有 Serde 配置可以做我想做的事,还是我应该求助于为 PortType 手动编写 Deserialize 和 Serialize 实现?
【问题讨论】: