我有一个 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 的客户端仅仅因为他们可能没有查看的配置选项中的未知字符串而开始失败。
为了解决这个问题,我添加了一个Unknown带有 a 的变体String来表示值:
#[derive(Eq, PartialEq, Deserialize, Serialize, Debug)]
#[serde(rename_all = "snake_case")]
pub enum PortType {
Sctp,
Tcp,
Udp,
Unknown(String),
}
这里的目标是在PortType::Unknown("dccp")传入未知值时得到稍微不方便的值。当然,这并不能实现我想要的开箱即用 - 传递未知"dccp"值将导致:
Error("unknown variant `dccp`, expected one of `sctp`, `tcp`, `udp`, `unknown`", line: 1, column: 55)
是否有 Serde 配置可以做我想做的事,还是我应该求助于手动编写Deserialize和Serialize实现PortType?