#enums-string #serialization #string-serialization #serde

macro no-std serde-enum-str

Serialize and deserialize enum string

13 releases

Uses new Rust 2024

0.5.0 Jan 3, 2026
0.4.0 Aug 4, 2023
0.3.2 Dec 17, 2022
0.2.5 Apr 5, 2022
0.1.4 Jul 25, 2021

#1198 in Encoding

Download history 34471/week @ 2025-10-25 43759/week @ 2025-11-01 28460/week @ 2025-11-08 40543/week @ 2025-11-15 40481/week @ 2025-11-22 43868/week @ 2025-11-29 46853/week @ 2025-12-06 51840/week @ 2025-12-13 15156/week @ 2025-12-20 13969/week @ 2025-12-27 25590/week @ 2026-01-03 44881/week @ 2026-01-10 59376/week @ 2026-01-17 61931/week @ 2026-01-24 66814/week @ 2026-01-31 64166/week @ 2026-02-07

261,204 downloads per month
Used in 95 crates (36 directly)

Apache-2.0 OR MIT

51KB
1K SLoC

serde-enum-str

Solves

https://stackoverflow.com/questions/57469527

Dev

cargo expand --verbose --test test

lib.rs:

Serialize and deserialize enum string.

[dependencies]
serde-enum-str = "0.3"
serde = { version = "1", features = ["derive"] }
use serde_enum_str::{Deserialize_enum_str, Serialize_enum_str};

#[derive(Deserialize_enum_str, Serialize_enum_str, Debug, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
enum Foo {
    A,
    #[serde(rename = "B")]
    B,
    #[serde(other)]
    Other(String),
}

fn main() -> serde_json::Result<()> {
    assert_eq!(serde_json::to_string(&Foo::A).unwrap(), r#""a""#);
    assert_eq!(serde_json::from_str::<Foo>(r#""a""#).unwrap(), Foo::A);

    assert_eq!(
        serde_json::from_str::<Foo>(r#""c""#).unwrap(),
        Foo::Other("c".to_owned())
    );

    assert_eq!(Foo::A.to_string(), "a");
    assert_eq!("a".parse::<Foo>().unwrap(), Foo::A);

    Ok(())
}

Dependencies

~0.5–1MB
~20K SLoC