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