我有一个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
变体,其中包含一个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配置,还是我应该手动编写PortType
的Deserialize
和Serialize
实现?