package emailcli import ( "fmt" "net/url" ) // buildQuery 将 map[string]interface{} 转成 url.Values。 // // 规则: // - nil / 空字符串 / 值为 0 的 int/uint 会被忽略(视作未传) // - int8 不做零值过滤(因为 0 可能是合法的状态值,如 Status=0 禁用) // - 指针类型 (*int / *int8 / *uint) 为 nil 时忽略,否则取值写入 // - 其它类型走 fmt.Sprintf("%v") 兜底 // // 这种设计允许调用方使用零值(空字符串 / 0)来表达"该过滤项不设置"。 func buildQuery(params map[string]interface{}) url.Values { q := url.Values{} for k, v := range params { if v == nil { continue } switch val := v.(type) { case string: if val != "" { q.Set(k, val) } case int: if val != 0 { q.Set(k, fmt.Sprintf("%d", val)) } case int8: q.Set(k, fmt.Sprintf("%d", val)) case uint: if val != 0 { q.Set(k, fmt.Sprintf("%d", val)) } case *int: if val != nil { q.Set(k, fmt.Sprintf("%d", *val)) } case *int8: if val != nil { q.Set(k, fmt.Sprintf("%d", *val)) } case *uint: if val != nil { q.Set(k, fmt.Sprintf("%d", *val)) } default: q.Set(k, fmt.Sprintf("%v", v)) } } return q } // paginationParams 将分页结构体转换为通用 map 形式的查询参数, // 供 mergeParams 与 buildQuery 继续拼装。Page / PageSize <=0 时会被忽略。 func paginationParams(p PaginationQuery) map[string]interface{} { m := map[string]interface{}{} if p.Page > 0 { m["page"] = p.Page } if p.PageSize > 0 { m["page_size"] = p.PageSize } return m } // mergeParams 合并多个查询参数 map,后者覆盖前者。 // 用于把分页参数与业务过滤参数拼在一起传给 buildQuery。 func mergeParams(maps ...map[string]interface{}) map[string]interface{} { result := map[string]interface{}{} for _, m := range maps { for k, v := range m { result[k] = v } } return result }