Google の位置履歴の JSON のフォーマットは JSON Schema で定義されている。
JSON Schema があると quicktype.io で変換して構造体が作れて嬉しい。
のだが、 source
の定義が厳しい。
"source": { "type": "string", "title": "Source", "description": "Source (technology) that provided the location information for this record.\nCommon values are: `WIFI`, `CELL`, `GPS`, `UNKNOWN` (note: sometimes found in lowercase).", "examples": [ "WIFI" ], "enum": [ "WIFI", "wifi", "CELL", "cell", "GPS", "gps", "UNKNOWN", "unknown" ] },
JSON Schema は名前を知っているだけのレベルなのだが、 "enum"
として定義されていると読み取った。ただ、その enum
の中身が酷くて、 WIFI
と wifi
のように大文字小文字が混在している。歴史的な都合でそう記録されてしまっていることはあるかもしれないけど、大文字か小文字に統一して出力したり、 "enum"
じゃなく文字列として定義したり、なんとかならなかったの?
これだけでもウッとなるのに、 Rust に変換したものを見ると目眩がしてくる。
#[derive(Serialize, Deserialize)] pub enum Source { #[serde(rename = "CELL")] Cell, #[serde(rename = "GPS")] Gps, #[serde(rename = "cell")] SourceCell, #[serde(rename = "gps")] SourceGps, #[serde(rename = "unknown")] SourceUnknown, #[serde(rename = "wifi")] SourceWifi, #[serde(rename = "UNKNOWN")] Unknown, #[serde(rename = "WIFI")] Wifi, }
Cell
と SouceCell
ってなにさ。小文字だと Source
を接頭辞につけるルールなの? そもそも定義の順番どうしちゃった 1 のさ。
- 書き終わってから気がついた。要素名の辞書順か・・・。↩