Reputation: 228
Given this enum definition:
#[repr(u8)]
#[derive(Debug, Serialize)]
pub enum AnimalType {
#[serde(rename = "cat")]
Cat = 1,
#[serde(rename = "dog")]
Dog = 2,
#[serde(rename = "snake")]
Snake = 3,
#[serde(rename = "capybara")]
Capybara = 4,
}
I'd like to be able to return JSON defining the above enum similar to this:
{
"AnimalType": [
{ "cat": 1 },
{ "dog": 2 },
{ "snake": 3 },
{ "capybara": 4 }
]
}
Is it possible to do this programmatically in Rust, possibly with serde
?
This question differs from How do I configure Serde to use an enum variant's discriminant rather than name? as I want to serialize the definition of the enum, not a value.
Upvotes: 3
Views: 1957
Reputation: 228
I ended up using strum
and its EnumVariantNames
macro: https://docs.rs/strum_macros/latest/strum_macros/derive.EnumVariantNames.html
#[repr(u8)]
#[derive(Serialize, EnumVariantNames)]
pub enum AnimalType {
#[serde(rename = "cat")]
#[strum(serialize = "cat")]
Cat = 1,
#[serde(rename = "dog")]
#[strum(serialize = "dog")]
Dog = 2,
#[serde(rename = "SNAKE")]
#[strum(serialize = "SNAKE")]
Snake = 3,
#[serde(rename = "capybara")]
#[strum(serialize = "capybara")]
Capybara = 4,
}
async fn get_animal_types() -> Result<impl warp::Reply, warp::Rejection> {
Ok(warp::reply::json(&AnimalType::VARIANTS))
}
Returning ["cat","dog","SNAKE","capybara"]
Upvotes: 4