SOMPO Digital Lab 開発チームブログ

安心・安全・健康に資する開発情報を発信します

Rustで都道府県を扱うjp-prefectureクレートを作った

SOMPO Digital Lab ソフトウェアエンジニアの木村です。

業務でアプリケーション開発やデータ分析をしていると日本の都道府県を扱いたくなるケースが多々あります。例えばユーザの住所や店舗の所在地を扱いたい場合です。

ただこの都道府県の扱いは地味に面倒くさかったりします。

例えば「東京都」を扱いたい場合なんかに、文字列から東京都を表すオブジェクトに変換しようとすると”東京都”, ”東京”, ”とうきょう”, ”トウキョウ”の文字列を全て「東京都」として変換して扱う必要があったりします。

(もちろんアプリケーションで行わずとも、予め名寄せしておくといった方法等もあります。)

先日、Rustで業務アプリケーションを開発している時に、このような処理を行う必要が発生しました。しかし、軽く探してみたところ日本の都道府県を扱えるような便利なクレートが存在しませんでした。

なければ自分で作ってしまおうということでjp-prefectureというクレートを開発しましたので紹介します。

開発した理由として、業務以外の個人的な開発で利用したかったというのもあります。

github.com

使い方

小さいライブラリなのでdoc.rsを読んでいただければ大体把握できるかとは思いますが、一応使い方のサンプルを書いてみます。

まず今回都道府県を表す値はenum型で定義してあります。以下のように。

pub enum Prefecture {
    Hokkaido,
    Aomori,
    // 省略
        Okinawa
}

例えば文字列の”東京都”から東京都を示すバリアントを生成したければ、

use jp_prefecture::prefectures::{self, Prefecture};

assert_eq!(prefectures::find_by_kanji("東京都"), Ok(Prefecture::Tokyo));

わざわざ”都”を付けなくても”東京”からも生成できます。

use jp_prefecture::prefectures::{self, Prefecture};

assert_eq!(prefectures::find_by_kanji("東京"), Ok(Prefecture::Tokyo));

”東京県”などの通常あり得ない読みの場合はエラーになります。

use jp_prefecture::{prefectures::{self, Prefecture}, Error};

assert_eq!(prefectures::find_by_kanji("東京県"), Err(Error::InvalidPrefectureName("東京県"));

他にもひらがな、カタカナ、英語読みから生成できる find_by_hiragana, find_by_katakana, find_by_english全国地方公共団体コードから生成できる find_by_codeが定義されています。

また、どの読み方からも生成できる findもあります。

use jp_prefecture::prefectures::{self, Prefecture};

assert_eq!(prefectures::find("東京"), Ok(Prefecture::Tokyo));
assert_eq!(prefectures::find("トウキョウ"), Ok(Prefecture::Tokyo));
assert_eq!(prefectures::find("とうきょうと"), Ok(Prefecture::Tokyo));
assert_eq!(prefectures::find("tokyo"), Ok(Prefecture::Tokyo));

あるいは逆にバリアントから各種読み方を生成することもできます。

use jp_prefecture::prefectures;

let tokyo = prefectures::find_by_kanji("東京都");
println!("{:?}", tokyo); // => Ok(Prefecture::Tokyo)
println!("{:?}", tokyo.unwrap().kanji()); // => "東京都"
println!("{:?}", tokyo.unwrap().kanji_short()); // => "東京"
println!("{:?}", tokyo.unwrap().english()); // => "tokyo"

まとめ

Rubyでしたらjp_prefecture、Goでしたらjp_prefectureといった都道府県を扱うライブラリが存在していたのですが、Rustでは存在しなかったので作りました。

良ければ使ってみて下さい。

SOMPO Digital Labでは一緒に働くソフトウェアエンジニアを募集しています

弊社ではRustで開発をしたいソフトウェアエンジニアを募集中です。

以下のリンクからカジュアル面談の応募ができるので、興味を持っていただけた方は是非話を聞きに来て下さい。

www.wantedly.com