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 }