Files
oci-portal/internal/oci/regions.go
T

55 lines
1.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package oci
import (
_ "embed"
"encoding/json"
"fmt"
"sort"
"strings"
"sync"
)
// regionsJSON 是本地维护的 OCI 区域表。官方 APIListRegions、
// 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, &regions); 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
}