我有一个JSON API,它返回一个如下所示的对象:
{
"PrivatePort": 2222,
"PublicPort": 3333,
"Type": "tcp"
}
为了捕捉这一点,我有一个枚举和一个 struct :
#[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
变量,用String
表示值:
#[derive(Eq, PartialEq, Deserialize, Serialize, Debug)]
#[serde(rename_all = "snake_case")]
pub enum PortType {
Sctp,
Tcp,
Udp,
Unknown(String),
}
这里的目标是在传入未知值时得到稍微不方便的PortType::Unknown("dccp")
值.当然,我不喜欢在这个框中传递值
Error("unknown variant `dccp`, expected one of `sctp`, `tcp`, `udp`, `unknown`", line: 1, column: 55)
是否有一个Serde配置来实现我想要的功能,或者我应该手动为PortType
编写Deserialize
和Serialize
实现?