2025-09-20 enum-str-conv はつくらなくても良かったのでは
bouzuya/zenn に下書きを加えた。 axum crate の handler についてのものだ。
bouzuya/enum-str-conv の属性がいまいちしっくりこない。そも属性はマクロごとに違うので学ぶのがつらい。そんなことを考えていたら「 serde
のものをそのまま使えばいいのでは」と思った。
#[derive(Debug, PartialEq, serde::Deserialize, serde::Serialize)]
enum Permission {
A,
B,
C,
}
impl std::fmt::Display for Permission {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
serde_json::to_value(&self)
.ok()
.as_ref()
.and_then(serde_json::Value::as_str)
.expect("should be a string")
.fmt(f)
}
}
impl std::str::FromStr for Permission {
type Err = serde_json::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
serde_json::from_value(serde_json::Value::String(s.to_owned()))
}
}
実行効率の悪さや serde::Deserialize
serde::Serialize
の実装が出てしまうのがイマイチだけど、そこは newtype などで隠せないことはない。
つくらなくて良かった derive macro だったか……。
今日のコミット。
- rust-examples 2 commits
- zenn 1 commit
- bouzuya 1 commit
- enum-str-conv 1 commit