🗡️

chrono から serde を使った Serialize できない場合の対処

2024/08/12に公開

はじめに

DB内の created_atupdated_atを参照する機会は少なくないと思いますが、
これらを Rust の chrono クレートを使って参照し、最終的に serde クレートの Serialize をしようとした時にプチハマりしたことをつらつら書いていきます。

エラー内容

以下のような構造体を定義し、属性マクロに Serialize を定義します。

#[derive(Serialize)]
struct Todos {
    id: String,
    title: String,
    description: Option<String>,
    created_at: chrono::DateTime<Utc>,
}

すると、以下のようなエラーが出ます。

     |
1865 |     fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
     |        --------------- required by a bound in this associated function
1866 |     where
1867 |         T: ?Sized + Serialize;
     |                     ^^^^^^^^^ required by this bound in `SerializeStruct::serialize_field`
     = note: this error originates in the derive macro `Serialize` (in Nightly builds, run with -Z macro-backtrace for more info)

For more information about this error, try `rustc --explain E0277`.

困ったのは、このエラーが出てもほとんど意味がわからなかったこと。

対処

Cargo.toml を以下のようにする。

[dependencies]
- chrono = "0.4.38"
+ chrono = { version = "0.4.38", features = ["serde"] }

対処としては、chrono クレートに features として serde を追加することでした。
chrono の github にも serde による Serialize を有効とするには serde を追加する必要があると言及されていました。(意外と見落としちゃうかも?)
https://github.com/chronotope/chrono

おわりに

私自身、意外とクレートのオプションは見落としがちだなと感じます。
クレートを使用する前に、しっかり読んでいる方がほとんどだと思うのであまり参考にならないかもしれません。
もし困ったら、ドキュメントや github を見直してみると良いかもしれません。私も気をつけます!

では!

コラボスタイル Developers

Discussion