package models // Sanitizer interface for models that can sanitize themselves // 用于从API响应中移除敏感字段 type Sanitizer interface { Sanitized() map[string]interface{} } // SanitizedJSON sanitizes a single model or a slice of models. // 使用接口替代类型断言,更优雅且可扩展。 func SanitizedJSON(v any) any { switch val := v.(type) { // Single objects: 尝试Sanitizer接口 case Sanitizer: return val.Sanitized() case *User: if val == nil { return nil } return val.Sanitized() case *Cluster: if val == nil { return nil } return val.Sanitized() case *Host: if val == nil { return nil } return val.Sanitized() case *StorageConfig: if val == nil { return nil } return val.Sanitized() case *Collector: if val == nil { return nil } return val.Sanitized() case *LokiDeployment: if val == nil { return nil } return val.Sanitized() // Slices case []User: result := make([]map[string]interface{}, len(val)) for i, item := range val { result[i] = item.Sanitized() } return result case []Cluster: result := make([]map[string]interface{}, len(val)) for i, item := range val { result[i] = item.Sanitized() } return result case []Host: result := make([]map[string]interface{}, len(val)) for i, item := range val { result[i] = item.Sanitized() } return result case []StorageConfig: result := make([]map[string]interface{}, len(val)) for i, item := range val { result[i] = item.Sanitized() } return result case []Collector: result := make([]map[string]interface{}, len(val)) for i, item := range val { result[i] = item.Sanitized() } return result case []LokiDeployment: result := make([]map[string]interface{}, len(val)) for i, item := range val { result[i] = item.Sanitized() } return result case []LogPolicyGroup: result := make([]map[string]interface{}, len(val)) for i := range val { result[i] = val[i].Sanitized() } return result case []Sanitizer: result := make([]map[string]interface{}, len(val)) for i, item := range val { result[i] = item.Sanitized() } return result default: // 尝试通过反射处理指针类型 return v } }