Map turns the qualifiers into a slice-keyed map ready for query formatting. Multiple struct fields can share the same key when tagged with `qualifier:" "`; in that case their values are concatenated under the shared key.
()
| 240 | // tagged with `qualifier:"<name>"`; in that case their values are |
| 241 | // concatenated under the shared key. |
| 242 | func (q Qualifiers) Map() map[string][]string { |
| 243 | m := map[string][]string{} |
| 244 | v := reflect.ValueOf(q) |
| 245 | t := reflect.TypeOf(q) |
| 246 | for i := 0; i < v.NumField(); i++ { |
| 247 | field := t.Field(i) |
| 248 | key := field.Tag.Get("qualifier") |
| 249 | if key == "" { |
| 250 | key = camelToKebab(field.Name) |
| 251 | } |
| 252 | value := v.Field(i) |
| 253 | switch value.Kind() { |
| 254 | case reflect.Ptr: |
| 255 | if value.IsNil() { |
| 256 | continue |
| 257 | } |
| 258 | m[key] = append(m[key], fmt.Sprintf("%v", reflect.Indirect(value))) |
| 259 | case reflect.Slice: |
| 260 | if value.IsNil() { |
| 261 | continue |
| 262 | } |
| 263 | for j := 0; j < value.Len(); j++ { |
| 264 | if value.Index(j).IsZero() { |
| 265 | continue |
| 266 | } |
| 267 | m[key] = append(m[key], fmt.Sprintf("%v", value.Index(j))) |
| 268 | } |
| 269 | default: |
| 270 | if value.IsZero() { |
| 271 | continue |
| 272 | } |
| 273 | m[key] = append(m[key], fmt.Sprintf("%v", value)) |
| 274 | } |
| 275 | } |
| 276 | return m |
| 277 | } |
| 278 | |
| 279 | func quote(s string) string { |
| 280 | if strings.ContainsAny(s, " \"\t\r\n") { |