Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

Records.schema.json VS quicktype

Google の位置履歴の JSON のフォーマットは JSON Schema で定義されている。

github.com

JSON Schema があると quicktype.io で変換して構造体が作れて嬉しい。

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 の中身が酷くて、 WIFIwifi のように大文字小文字が混在している。歴史的な都合でそう記録されてしまっていることはあるかもしれないけど、大文字か小文字に統一して出力したり、 "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,
}

CellSouceCell ってなにさ。小文字だと Source を接頭辞につけるルールなの? そもそも定義の順番どうしちゃった 1 のさ。


  1. 書き終わってから気がついた。要素名の辞書順か・・・。