SuggestRegions returns filtered region suggestions.
( query string, allRegions []string, productRegions map[string][]string, productTags []string, selectedTags []string, )
| 254 | |
| 255 | // SuggestRegions returns filtered region suggestions. |
| 256 | func SuggestRegions( |
| 257 | query string, |
| 258 | allRegions []string, |
| 259 | productRegions map[string][]string, |
| 260 | productTags []string, |
| 261 | selectedTags []string, |
| 262 | ) []SuggestionItem { |
| 263 | q := strings.ToLower(query) |
| 264 | |
| 265 | // Build region->providers map |
| 266 | regionProviders := map[string]map[string]struct{}{} |
| 267 | for productKey, regs := range productRegions { |
| 268 | parts := strings.Fields(productKey) |
| 269 | provider := productKey |
| 270 | if len(parts) > 0 { |
| 271 | provider = parts[0] |
| 272 | } |
| 273 | for _, r := range regs { |
| 274 | if r == "" { |
| 275 | continue |
| 276 | } |
| 277 | if regionProviders[r] == nil { |
| 278 | regionProviders[r] = map[string]struct{}{} |
| 279 | } |
| 280 | regionProviders[r][provider] = struct{}{} |
| 281 | } |
| 282 | } |
| 283 | |
| 284 | var regions []string |
| 285 | if len(productTags) == 0 { |
| 286 | regions = append([]string{}, allRegions...) |
| 287 | sort.Strings(regions) |
| 288 | } else { |
| 289 | seen := map[string]struct{}{} |
| 290 | for _, p := range productTags { |
| 291 | if regs, ok := productRegions[strings.ToLower(p)]; ok { |
| 292 | for _, r := range regs { |
| 293 | if r != "" { |
| 294 | seen[r] = struct{}{} |
| 295 | } |
| 296 | } |
| 297 | } |
| 298 | } |
| 299 | if len(seen) == 0 { |
| 300 | regions = append([]string{}, allRegions...) |
| 301 | } else { |
| 302 | for r := range seen { |
| 303 | regions = append(regions, r) |
| 304 | } |
| 305 | } |
| 306 | sort.Strings(regions) |
| 307 | } |
| 308 | |
| 309 | var items []SuggestionItem |
| 310 | for _, r := range regions { |
| 311 | if q != "" && !strings.Contains(strings.ToLower(r), q) { |
| 312 | continue |
| 313 | } |