イントロ

すっかり人気となったRustで、ライブラリクレートを作成したので公開してみました。 日本独自の「暦」に関するあれこれを扱えるライブラリです。

https://crates.io/crates/koyomi-rs

きっかけ

Rustは1.0が出た頃からずっと追いかけていたのですが、最近はずっと最新バージョンリリースのニュースを見るたびにrustup updateしているだけでした。

これではダメだと一念発起し、3年ほど前に公開したクレートのkoyomiをイチから書き直すチャレンジをしました。

モチベーション

システムやアプリケーションで日本の祝日を管理するには、DBのテーブルや設定ファイルなどを利用するケースが多いと思います。 これは確かにシンプルで管理しやすいものの、「定期的なメンテナンス」というトレードオフがどうしても発生します。

また、DB/ファイルといったストレージ層で情報を管理するため、問題になるケースはそうそう無いでしょうが、 「I/Oから逃れられない」という宿命を抱えることにもなります。

こういった問題から脱却して、ストレージ層での管理を必要とせず、いつでも日本の祝日を判定できるようにしたいと考えて開発したのが前作のkoyomiです。

koyomi では、やりたい事を実現できていたものの、当時のRust理解力やスキルの未熟さもあって、今見ると何とも消化不良なコードです。 あらためて、「今ならこう書く」で出来上がったのがkoyomi-rsです。

主な機能

最初は祝日判定に主眼を置いてコードを書いていましたが、ある程度形になってくると欲が出てくるもので、 他にもあんな事やこんな事を多少盛りこみました。

大原則として、Rustの有名なcrateであるchronoに依存しています。 外部crateへの依存は可能な限り避けたかったですが、Rustで日付を扱うなら実質標準ライブラリのようなものなので良しとしました。

日本の祝日判定

DBや設定ファイル不要で、振替休日を含む日本の祝日を判定できます。

過去の祝日にとどまらず、法律が変わらない限り未来の祝日も正しく判定できるはずですが、 この辺りはテストが書けていないので今後の課題だと思っています。

和暦の計算

「令和」「平成」といった、日本の元号を計算できます。例えば2024年は「令和6年」ですが、これを正しく導出してくれます。

本当は「明治」以前の元号も対象としたかったのですが、太陰暦ベースでの計算など現時点ではハードルが高く、 現時点では令和〜明治までがサポート範囲となっています。

これもちゃんと取り組んで、過去の元号をすべてサポートできるようにしたいと考えています。

旧暦の月名

1月なら「睦月」、12月なら「師走」といったように、日本独自の月名を導出してくれます。

干支

お馴染み「十二支」から、十干と組み合わせた「六十干支」まで導出してくれます。

この辺りを実装するにあたって、chinese-lunisolar-calendarというクレートが大変参考になりました。 国を問わず同じようなことを考える人は居るものですね。実装を公開いただいてる事に感謝です。

今後の展望

手元でずっと温めているといつまでも完成しないので、キリの良いところで公開しましたが、機能面ではまだまだやりたい事が盛り沢山です。

  • カレンダーの構造化
  • 明治以前の元号に対応
  • 六曜の導出
  • CLIでの利用

また、Rust以外の好きな言語でも同じようなライブラリを作っていきたいと考えていますので、 形になったものはこのブログで発信していこうと思います。