blog.bouzuya.net

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 だったか……。


今日のコミット。