55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package oci
|
||
|
||
import (
|
||
_ "embed"
|
||
"encoding/json"
|
||
"fmt"
|
||
"sort"
|
||
"strings"
|
||
"sync"
|
||
)
|
||
|
||
// regionsJSON 是本地维护的 OCI 区域表。官方 API(ListRegions、
|
||
// ListRegionSubscriptions 等)只返回 key 和 name,控制台风格的
|
||
// 友好名称(alias)官方不提供查询接口,因此在此文件旁的
|
||
// regions.json 中单独维护,新增区域时直接编辑该文件。
|
||
//
|
||
//go:embed regions.json
|
||
var regionsJSON []byte
|
||
|
||
// RegionInfo 描述一个 OCI 区域。
|
||
type RegionInfo struct {
|
||
Alias string `json:"alias"`
|
||
Key string `json:"key"`
|
||
Name string `json:"name"`
|
||
}
|
||
|
||
var loadRegions = sync.OnceValues(func() ([]RegionInfo, error) {
|
||
var regions []RegionInfo
|
||
if err := json.Unmarshal(regionsJSON, ®ions); err != nil {
|
||
return nil, fmt.Errorf("parse embedded regions.json: %w", err)
|
||
}
|
||
// 全局统一按友好名排序,维护 regions.json 时无需关心条目顺序
|
||
sort.SliceStable(regions, func(i, j int) bool { return regions[i].Alias < regions[j].Alias })
|
||
return regions, nil
|
||
})
|
||
|
||
// AllRegions 返回本地维护的完整区域表。
|
||
func AllRegions() ([]RegionInfo, error) {
|
||
return loadRegions()
|
||
}
|
||
|
||
// RegionByKey 按三字码(如 FRA)查找区域,大小写不敏感。
|
||
func RegionByKey(key string) (RegionInfo, bool) {
|
||
regions, err := loadRegions()
|
||
if err != nil {
|
||
return RegionInfo{}, false
|
||
}
|
||
for _, r := range regions {
|
||
if strings.EqualFold(r.Key, key) {
|
||
return r, true
|
||
}
|
||
}
|
||
return RegionInfo{}, false
|
||
}
|