Steve
Steve

Reputation: 228

Can I serialize an enum's definition with serde?

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

Answers (1)

Steve
Steve

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

Related Questions