初始提交:OCI 面板后端(含 GenAI 网关一期)
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user