Crates.io | enum-str-conv |
lib.rs | enum-str-conv |
version | 0.1.1 |
created_at | 2025-09-17 23:07:37.148707+00 |
updated_at | 2025-09-17 23:07:37.148707+00 |
description | A derive macro to convert between enum and str |
homepage | |
repository | https://github.com/bouzuya/enum-str-conv |
max_upload_size | |
id | 1844024 |
size | 25,116 |
A Rust library that provides derive macro to convert between enum and str (Display
/FromStr
).
#[derive(enum_str_conv::EnumStrConv)]
to your enum#[enum_str_conv(error = ErrorType, unknown = unknown_fn)]
to your enum#[enum_str_conv(str = "...")]
to your enum variantsThis code generates the following code:
#[derive(enum_str_conv::EnumStrConv)]
#[enum_str_conv(error = MyError, unknown = MyError::Unknown)]
enum MyEnum {
#[enum_str_conv(str = "apple")]
A,
#[enum_str_conv(str = "banana")]
B,
#[enum_str_conv(str = "cherry")]
C,
}
#[automatically_derived]
impl ::std::fmt::Display for MyEnum {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::A => write!(f, "apple"),
Self::B => write!(f, "banana"),
Self::C => write!(f, "cherry"),
}
}
}
#[automatically_derived]
impl ::std::str::FromStr for MyEnum {
type Err = MyError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"apple" => Ok(Self::A),
"banana" => Ok(Self::B),
"cherry" => Ok(Self::C),
_ => Err(MyError::Unknown(s.to_owned())),
}
}
}
#[derive(Debug)]
enum MyError {
Unknown(String),
}
impl std::fmt::Display for MyError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
MyError::Unknown(s) => write!(f, "unknown variant: {0}", s),
}
}
}
impl std::error::Error for MyError {}
#[derive(Debug, PartialEq, enum_str_conv::EnumStrConv)]
#[enum_str_conv(error = MyError, unknown = MyError::Unknown)]
enum MyEnum {
#[enum_str_conv(str = "apple")]
A,
#[enum_str_conv(str = "banana")]
B,
#[enum_str_conv(str = "cherry")]
C,
}
use std::str::FromStr;
assert_eq!(MyEnum::from_str("apple").unwrap(), MyEnum::A);
assert_eq!(MyEnum::A.to_string(), "apple");
assert_eq!(MyEnum::from_str("durian").unwrap_err().to_string(), "unknown variant: durian");
// You can also use a non-Error type (e.g., String) as the error type:
fn unknown_fn(s: String) -> String {
format!("unknown: {s}")
}
#[derive(Debug, PartialEq, enum_str_conv::EnumStrConv)]
#[enum_str_conv(error = String, unknown = unknown_fn)]
enum MyEnum2 {
#[enum_str_conv(str = "apple")]
A,
#[enum_str_conv(str = "banana")]
B,
#[enum_str_conv(str = "cherry")]
C,
}
use std::str::FromStr;
assert_eq!(MyEnum2::from_str("apple").unwrap(), MyEnum2::A);
assert_eq!(MyEnum2::A.to_string(), "apple");
assert_eq!(MyEnum2::from_str("durian").unwrap_err(), "unknown: durian");
Attribute arguments:
#[enum_str_conv(error = ...)]
: Specifies the error type.#[enum_str_conv(unknown = ...)]
: Specifies the handler for unknown values.#[enum_str_conv(str = "...")]
: Specifies the string for the variant.
This crate was inspired by the following prior art:
EnumString
and ToString
, but comes with many dependencies.This project is licensed under either of
at your option.