Files
go-mobile-uiautomator/libs/settings.go
2026-03-10 15:49:36 +08:00

140 lines
2.8 KiB
Go

package libs
import (
"fmt"
"sync"
)
// Settings 管理设备的各项配置参数
// 支持类型安全的读写操作
type Settings struct {
mu sync.RWMutex
data map[string]interface{}
}
// 默认配置值
var defaultSettings = map[string]interface{}{
// 等待元素出现的超时时间(秒)
"wait_timeout": 20.0,
// 操作前后的延迟 [前延迟, 后延迟](秒)
"operation_delay": [2]float64{0, 0},
// 需要应用操作延迟的方法列表
"operation_delay_methods": []string{"click", "swipe", "drag", "press"},
// dump_hierarchy 的最大深度
"max_depth": 50,
}
// NewSettings 创建一个新的 Settings 实例,使用默认配置
func NewSettings() *Settings {
s := &Settings{
data: make(map[string]interface{}),
}
// 复制默认配置
for k, v := range defaultSettings {
s.data[k] = v
}
return s
}
// Get 获取配置项的值
// 如果配置项不存在,返回 nil
func (s *Settings) Get(key string) interface{} {
s.mu.RLock()
defer s.mu.RUnlock()
return s.data[key]
}
// GetFloat64 获取 float64 类型的配置值
func (s *Settings) GetFloat64(key string) float64 {
v := s.Get(key)
if v == nil {
return 0
}
switch val := v.(type) {
case float64:
return val
case float32:
return float64(val)
case int:
return float64(val)
default:
return 0
}
}
// GetInt 获取 int 类型的配置值
func (s *Settings) GetInt(key string) int {
v := s.Get(key)
if v == nil {
return 0
}
switch val := v.(type) {
case int:
return val
case float64:
return int(val)
default:
return 0
}
}
// GetStringSlice 获取 []string 类型的配置值
func (s *Settings) GetStringSlice(key string) []string {
v := s.Get(key)
if v == nil {
return nil
}
if val, ok := v.([]string); ok {
return val
}
return nil
}
// GetOperationDelay 获取操作延迟配置 [前延迟, 后延迟]
func (s *Settings) GetOperationDelay() (float64, float64) {
v := s.Get("operation_delay")
if v == nil {
return 0, 0
}
if val, ok := v.([2]float64); ok {
return val[0], val[1]
}
return 0, 0
}
// Set 设置配置项的值,包含类型校验
func (s *Settings) Set(key string, value interface{}) error {
s.mu.Lock()
defer s.mu.Unlock()
// 类型校验
if existing, ok := defaultSettings[key]; ok {
if err := validateSettingType(key, existing, value); err != nil {
return err
}
}
s.data[key] = value
return nil
}
// validateSettingType 校验设置值的类型是否与默认值匹配
func validateSettingType(key string, defaultVal, newVal interface{}) error {
switch defaultVal.(type) {
case float64:
switch newVal.(type) {
case float64, float32, int, int64:
return nil
default:
return fmt.Errorf("配置 %s 必须是数值类型", key)
}
case int:
switch newVal.(type) {
case int, int64, float64:
return nil
default:
return fmt.Errorf("配置 %s 必须是整数类型", key)
}
}
return nil
}