blob: ba392e1801446674189a5babeb0e1bef421afc65 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package build
import (
_ "embed"
"encoding/json"
"fmt"
"strconv"
)
//go:embed version_history.json
var versionHistoryBytes []byte
var versions []Version
const versionHistorySchemaId string = "https://fuchsia.dev/schema/version_history-038fa854.json"
const versionHistoryName string = "Platform version map"
const versionHistoryType string = "version_history"
type Version struct {
APILevel uint64
ABIRevision uint64
}
type versionHistory struct {
SchemaId string `json:"schema_id"`
Data versionHistoryData `json:"data"`
}
type versionHistoryData struct {
Name string `json:"name"`
Type string `json:"type"`
Versions []versionHistoryVersion `json:"versions"`
}
type versionHistoryVersion struct {
APILevel string `json:"api_level"`
ABIRevision string `json:"abi_revision"`
}
func parseVersionHistory(b []byte) ([]Version, error) {
var vh versionHistory
// Load external JSON of SDK version history
if err := json.Unmarshal(b, &vh); err != nil {
return []Version{}, err
}
if vh.SchemaId != versionHistorySchemaId {
return []Version{}, fmt.Errorf("expected schema id %q, not %q", versionHistorySchemaId, vh.SchemaId)
}
if vh.Data.Name != versionHistoryName {
return []Version{}, fmt.Errorf("expected name \"version_history\", not %q", vh.Data.Name)
}
if vh.Data.Type != versionHistoryType {
return []Version{}, fmt.Errorf("expected type \"version_history\", not %q", vh.Data.Type)
}
vs := []Version{}
for _, version := range vh.Data.Versions {
apiLevel, err := strconv.ParseUint(version.APILevel, 10, 64)
if err != nil {
return []Version{}, fmt.Errorf("failed to parse API level as an integer: %w", err)
}
abiRevision, err := strconv.ParseUint(version.ABIRevision, 0, 64)
if err != nil {
return []Version{}, fmt.Errorf("failed to parse ABI revision as an integer: %w", err)
}
vs = append(vs, Version{
APILevel: apiLevel,
ABIRevision: uint64(abiRevision),
})
}
return vs, nil
}
func init() {
v, err := parseVersionHistory(versionHistoryBytes)
if err != nil {
panic(fmt.Sprintf("failed to parse version_history.json: %s", err))
}
versions = v
}
func Versions() []Version {
return versions
}