diff --git a/internal/configuration/settings/serverselection.go b/internal/configuration/settings/serverselection.go index c9b8d7ee..bd1b954c 100644 --- a/internal/configuration/settings/serverselection.go +++ b/internal/configuration/settings/serverselection.go @@ -144,82 +144,82 @@ func getLocationFilterChoices(vpnServiceProvider string, ss *ServerSelection, case providers.Custom: case providers.Cyberghost: servers := allServers.GetCyberghost() - countryChoices = validation.CyberghostCountryChoices(servers) - hostnameChoices = validation.CyberghostHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Expressvpn: servers := allServers.GetExpressvpn() - countryChoices = validation.ExpressvpnCountriesChoices(servers) - cityChoices = validation.ExpressvpnCityChoices(servers) - hostnameChoices = validation.ExpressvpnHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Fastestvpn: servers := allServers.GetFastestvpn() - countryChoices = validation.FastestvpnCountriesChoices(servers) - hostnameChoices = validation.FastestvpnHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.HideMyAss: servers := allServers.GetHideMyAss() - countryChoices = validation.HideMyAssCountryChoices(servers) - regionChoices = validation.HideMyAssRegionChoices(servers) - cityChoices = validation.HideMyAssCityChoices(servers) - hostnameChoices = validation.HideMyAssHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + regionChoices = validation.ExtractRegions(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Ipvanish: servers := allServers.GetIpvanish() - countryChoices = validation.IpvanishCountryChoices(servers) - cityChoices = validation.IpvanishCityChoices(servers) - hostnameChoices = validation.IpvanishHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Ivpn: servers := allServers.GetIvpn() - countryChoices = validation.IvpnCountryChoices(servers) - cityChoices = validation.IvpnCityChoices(servers) - ispChoices = validation.IvpnISPChoices(servers) - hostnameChoices = validation.IvpnHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + cityChoices = validation.ExtractCities(servers) + ispChoices = validation.ExtractISPs(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Mullvad: servers := allServers.GetMullvad() - countryChoices = validation.MullvadCountryChoices(servers) - cityChoices = validation.MullvadCityChoices(servers) - ispChoices = validation.MullvadISPChoices(servers) - hostnameChoices = validation.MullvadHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + cityChoices = validation.ExtractCities(servers) + ispChoices = validation.ExtractISPs(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Nordvpn: servers := allServers.GetNordvpn() - regionChoices = validation.NordvpnRegionChoices(servers) - hostnameChoices = validation.NordvpnHostnameChoices(servers) + regionChoices = validation.ExtractRegions(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Perfectprivacy: servers := allServers.GetPerfectprivacy() - cityChoices = validation.PerfectprivacyCityChoices(servers) + cityChoices = validation.ExtractCities(servers) case providers.Privado: servers := allServers.GetPrivado() - countryChoices = validation.PrivadoCountryChoices(servers) - regionChoices = validation.PrivadoRegionChoices(servers) - cityChoices = validation.PrivadoCityChoices(servers) - hostnameChoices = validation.PrivadoHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + regionChoices = validation.ExtractRegions(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.PrivateInternetAccess: servers := allServers.GetPia() - regionChoices = validation.PIAGeoChoices(servers) - hostnameChoices = validation.PIAHostnameChoices(servers) - nameChoices = validation.PIANameChoices(servers) + regionChoices = validation.ExtractRegions(servers) + hostnameChoices = validation.ExtractHostnames(servers) + nameChoices = validation.ExtractServerNames(servers) case providers.Privatevpn: servers := allServers.GetPrivatevpn() - countryChoices = validation.PrivatevpnCountryChoices(servers) - cityChoices = validation.PrivatevpnCityChoices(servers) - hostnameChoices = validation.PrivatevpnHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Protonvpn: servers := allServers.GetProtonvpn() - countryChoices = validation.ProtonvpnCountryChoices(servers) - regionChoices = validation.ProtonvpnRegionChoices(servers) - cityChoices = validation.ProtonvpnCityChoices(servers) - nameChoices = validation.ProtonvpnNameChoices(servers) - hostnameChoices = validation.ProtonvpnHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + regionChoices = validation.ExtractRegions(servers) + cityChoices = validation.ExtractCities(servers) + nameChoices = validation.ExtractServerNames(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Purevpn: servers := allServers.GetPurevpn() - countryChoices = validation.PurevpnCountryChoices(servers) - regionChoices = validation.PurevpnRegionChoices(servers) - cityChoices = validation.PurevpnCityChoices(servers) - hostnameChoices = validation.PurevpnHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + regionChoices = validation.ExtractRegions(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Surfshark: servers := allServers.GetSurfshark() - countryChoices = validation.SurfsharkCountryChoices(servers) - cityChoices = validation.SurfsharkCityChoices(servers) - hostnameChoices = validation.SurfsharkHostnameChoices(servers) - regionChoices = validation.SurfsharkRegionChoices(servers) + countryChoices = validation.ExtractCountries(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) + regionChoices = validation.ExtractRegions(servers) // TODO v4 remove regionChoices = append(regionChoices, validation.SurfsharkRetroLocChoices()...) if err := helpers.AreAllOneOf(ss.Regions, regionChoices); err != nil { @@ -230,26 +230,26 @@ func getLocationFilterChoices(vpnServiceProvider string, ss *ServerSelection, *ss = surfsharkRetroRegion(*ss) case providers.Torguard: servers := allServers.GetTorguard() - countryChoices = validation.TorguardCountryChoices(servers) - cityChoices = validation.TorguardCityChoices(servers) - hostnameChoices = validation.TorguardHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.VPNUnlimited: servers := allServers.GetVPNUnlimited() - countryChoices = validation.VPNUnlimitedCountryChoices(servers) - cityChoices = validation.VPNUnlimitedCityChoices(servers) - hostnameChoices = validation.VPNUnlimitedHostnameChoices(servers) + countryChoices = validation.ExtractCountries(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Vyprvpn: servers := allServers.GetVyprvpn() - regionChoices = validation.VyprvpnRegionChoices(servers) + regionChoices = validation.ExtractRegions(servers) case providers.Wevpn: servers := allServers.GetWevpn() - cityChoices = validation.WevpnCityChoices(servers) - hostnameChoices = validation.WevpnHostnameChoices(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) case providers.Windscribe: servers := allServers.GetWindscribe() - regionChoices = validation.WindscribeRegionChoices(servers) - cityChoices = validation.WindscribeCityChoices(servers) - hostnameChoices = validation.WindscribeHostnameChoices(servers) + regionChoices = validation.ExtractRegions(servers) + cityChoices = validation.ExtractCities(servers) + hostnameChoices = validation.ExtractHostnames(servers) default: return nil, nil, nil, nil, nil, nil, fmt.Errorf("%w: %s", ErrVPNProviderNameNotValid, vpnServiceProvider) } diff --git a/internal/configuration/settings/validation/cyberghost.go b/internal/configuration/settings/validation/cyberghost.go deleted file mode 100644 index fae93fbe..00000000 --- a/internal/configuration/settings/validation/cyberghost.go +++ /dev/null @@ -1,21 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func CyberghostCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func CyberghostHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/expressvpn.go b/internal/configuration/settings/validation/expressvpn.go deleted file mode 100644 index 17472e0c..00000000 --- a/internal/configuration/settings/validation/expressvpn.go +++ /dev/null @@ -1,29 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func ExpressvpnCountriesChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func ExpressvpnCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func ExpressvpnHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/fastestvpn.go b/internal/configuration/settings/validation/fastestvpn.go deleted file mode 100644 index 2256dc1c..00000000 --- a/internal/configuration/settings/validation/fastestvpn.go +++ /dev/null @@ -1,21 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func FastestvpnCountriesChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func FastestvpnHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/helpers.go b/internal/configuration/settings/validation/helpers.go deleted file mode 100644 index a83b2874..00000000 --- a/internal/configuration/settings/validation/helpers.go +++ /dev/null @@ -1,23 +0,0 @@ -package validation - -import "sort" - -func makeUnique(choices []string) (uniqueChoices []string) { - seen := make(map[string]struct{}, len(choices)) - uniqueChoices = make([]string, 0, len(uniqueChoices)) - - for _, choice := range choices { - if _, ok := seen[choice]; ok { - continue - } - seen[choice] = struct{}{} - - uniqueChoices = append(uniqueChoices, choice) - } - - sort.Slice(uniqueChoices, func(i, j int) bool { - return uniqueChoices[i] < uniqueChoices[j] - }) - - return uniqueChoices -} diff --git a/internal/configuration/settings/validation/hidemyass.go b/internal/configuration/settings/validation/hidemyass.go deleted file mode 100644 index 5e5c3876..00000000 --- a/internal/configuration/settings/validation/hidemyass.go +++ /dev/null @@ -1,37 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func HideMyAssCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func HideMyAssRegionChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Region - } - return makeUnique(choices) -} - -func HideMyAssCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func HideMyAssHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/ipvanish.go b/internal/configuration/settings/validation/ipvanish.go deleted file mode 100644 index eec8962e..00000000 --- a/internal/configuration/settings/validation/ipvanish.go +++ /dev/null @@ -1,29 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func IpvanishCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func IpvanishCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func IpvanishHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/ivpn.go b/internal/configuration/settings/validation/ivpn.go deleted file mode 100644 index 9da6f168..00000000 --- a/internal/configuration/settings/validation/ivpn.go +++ /dev/null @@ -1,37 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func IvpnCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func IvpnCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func IvpnISPChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].ISP - } - return makeUnique(choices) -} - -func IvpnHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/mullvad.go b/internal/configuration/settings/validation/mullvad.go deleted file mode 100644 index 122b2334..00000000 --- a/internal/configuration/settings/validation/mullvad.go +++ /dev/null @@ -1,37 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func MullvadCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func MullvadCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func MullvadHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} - -func MullvadISPChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].ISP - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/nordvpn.go b/internal/configuration/settings/validation/nordvpn.go deleted file mode 100644 index 8f7e49d0..00000000 --- a/internal/configuration/settings/validation/nordvpn.go +++ /dev/null @@ -1,21 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func NordvpnRegionChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Region - } - return makeUnique(choices) -} - -func NordvpnHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/perfectprivacy.go b/internal/configuration/settings/validation/perfectprivacy.go deleted file mode 100644 index 7b268e3b..00000000 --- a/internal/configuration/settings/validation/perfectprivacy.go +++ /dev/null @@ -1,13 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func PerfectprivacyCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/pia.go b/internal/configuration/settings/validation/pia.go deleted file mode 100644 index 49b4d1ff..00000000 --- a/internal/configuration/settings/validation/pia.go +++ /dev/null @@ -1,29 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func PIAGeoChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Region - } - return makeUnique(choices) -} - -func PIAHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} - -func PIANameChoices(servers []models.Server) (choices []string) { // TODO remove in v4 - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].ServerName - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/privado.go b/internal/configuration/settings/validation/privado.go deleted file mode 100644 index 0ddc35f0..00000000 --- a/internal/configuration/settings/validation/privado.go +++ /dev/null @@ -1,35 +0,0 @@ -package validation - -import "github.com/qdm12/gluetun/internal/models" - -func PrivadoCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func PrivadoRegionChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Region - } - return makeUnique(choices) -} - -func PrivadoCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func PrivadoHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/privatevpn.go b/internal/configuration/settings/validation/privatevpn.go deleted file mode 100644 index 7a23d596..00000000 --- a/internal/configuration/settings/validation/privatevpn.go +++ /dev/null @@ -1,27 +0,0 @@ -package validation - -import "github.com/qdm12/gluetun/internal/models" - -func PrivatevpnCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func PrivatevpnCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func PrivatevpnHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/protonvpn.go b/internal/configuration/settings/validation/protonvpn.go deleted file mode 100644 index 48c2daaa..00000000 --- a/internal/configuration/settings/validation/protonvpn.go +++ /dev/null @@ -1,43 +0,0 @@ -package validation - -import "github.com/qdm12/gluetun/internal/models" - -func ProtonvpnCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func ProtonvpnRegionChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Region - } - return makeUnique(choices) -} - -func ProtonvpnCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func ProtonvpnNameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].ServerName - } - return makeUnique(choices) -} - -func ProtonvpnHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/purevpn.go b/internal/configuration/settings/validation/purevpn.go deleted file mode 100644 index 4e3073f0..00000000 --- a/internal/configuration/settings/validation/purevpn.go +++ /dev/null @@ -1,35 +0,0 @@ -package validation - -import "github.com/qdm12/gluetun/internal/models" - -func PurevpnRegionChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Region - } - return makeUnique(choices) -} - -func PurevpnCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func PurevpnCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func PurevpnHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/servers.go b/internal/configuration/settings/validation/servers.go new file mode 100644 index 00000000..9606e3dd --- /dev/null +++ b/internal/configuration/settings/validation/servers.go @@ -0,0 +1,111 @@ +package validation + +import ( + "sort" + + "github.com/qdm12/gluetun/internal/models" +) + +func sortedInsert(ss []string, s string) []string { + i := sort.SearchStrings(ss, s) + ss = append(ss, "") + copy(ss[i+1:], ss[i:]) + ss[i] = s + return ss +} + +func ExtractCountries(servers []models.Server) (values []string) { + seen := make(map[string]struct{}, len(servers)) + values = make([]string, 0, len(servers)) + for _, server := range servers { + value := server.Country + _, alreadySeen := seen[value] + if alreadySeen { + continue + } + seen[value] = struct{}{} + + values = sortedInsert(values, value) + } + return values +} + +func ExtractRegions(servers []models.Server) (values []string) { + seen := make(map[string]struct{}, len(servers)) + values = make([]string, 0, len(servers)) + for _, server := range servers { + value := server.Region + _, alreadySeen := seen[value] + if alreadySeen { + continue + } + seen[value] = struct{}{} + + values = sortedInsert(values, value) + } + return values +} + +func ExtractCities(servers []models.Server) (values []string) { + seen := make(map[string]struct{}, len(servers)) + values = make([]string, 0, len(servers)) + for _, server := range servers { + value := server.City + _, alreadySeen := seen[value] + if alreadySeen { + continue + } + seen[value] = struct{}{} + + values = sortedInsert(values, value) + } + return values +} + +func ExtractISPs(servers []models.Server) (values []string) { + seen := make(map[string]struct{}, len(servers)) + values = make([]string, 0, len(servers)) + for _, server := range servers { + value := server.ISP + _, alreadySeen := seen[value] + if alreadySeen { + continue + } + seen[value] = struct{}{} + + values = sortedInsert(values, value) + } + return values +} + +func ExtractServerNames(servers []models.Server) (values []string) { + seen := make(map[string]struct{}, len(servers)) + values = make([]string, 0, len(servers)) + for _, server := range servers { + value := server.ServerName + _, alreadySeen := seen[value] + if alreadySeen { + continue + } + seen[value] = struct{}{} + + values = sortedInsert(values, value) + } + return values +} + +func ExtractHostnames(servers []models.Server) (values []string) { + seen := make(map[string]struct{}, len(servers)) + values = make([]string, 0, len(servers)) + for _, server := range servers { + value := server.Hostname + _, alreadySeen := seen[value] + if alreadySeen { + continue + } + seen[value] = struct{}{} + + values = sortedInsert(values, value) + } + return values +} diff --git a/internal/configuration/settings/validation/surfshark.go b/internal/configuration/settings/validation/surfshark.go index d7ecc5e0..91a76a2d 100644 --- a/internal/configuration/settings/validation/surfshark.go +++ b/internal/configuration/settings/validation/surfshark.go @@ -1,44 +1,9 @@ package validation import ( - "sort" - "github.com/qdm12/gluetun/internal/constants" - "github.com/qdm12/gluetun/internal/models" ) -func SurfsharkRegionChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Region - } - return makeUnique(choices) -} - -func SurfsharkCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func SurfsharkCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func SurfsharkHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} - // TODO remove in v4. func SurfsharkRetroLocChoices() (choices []string) { locationData := constants.SurfsharkLocationData() @@ -49,12 +14,8 @@ func SurfsharkRetroLocChoices() (choices []string) { continue } seen[data.RetroLoc] = struct{}{} - choices = append(choices, data.RetroLoc) + choices = sortedInsert(choices, data.RetroLoc) } - sort.Slice(choices, func(i, j int) bool { - return choices[i] < choices[j] - }) - return choices } diff --git a/internal/configuration/settings/validation/torguard.go b/internal/configuration/settings/validation/torguard.go deleted file mode 100644 index aec183bb..00000000 --- a/internal/configuration/settings/validation/torguard.go +++ /dev/null @@ -1,29 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func TorguardCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func TorguardCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func TorguardHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/vpnunlimited.go b/internal/configuration/settings/validation/vpnunlimited.go deleted file mode 100644 index f94ec6ae..00000000 --- a/internal/configuration/settings/validation/vpnunlimited.go +++ /dev/null @@ -1,29 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func VPNUnlimitedCountryChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Country - } - return makeUnique(choices) -} - -func VPNUnlimitedCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func VPNUnlimitedHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/vyprvpn.go b/internal/configuration/settings/validation/vyprvpn.go deleted file mode 100644 index 97be8e0f..00000000 --- a/internal/configuration/settings/validation/vyprvpn.go +++ /dev/null @@ -1,13 +0,0 @@ -package validation - -import ( - "github.com/qdm12/gluetun/internal/models" -) - -func VyprvpnRegionChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Region - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/wevpn.go b/internal/configuration/settings/validation/wevpn.go deleted file mode 100644 index d122ac43..00000000 --- a/internal/configuration/settings/validation/wevpn.go +++ /dev/null @@ -1,19 +0,0 @@ -package validation - -import "github.com/qdm12/gluetun/internal/models" - -func WevpnCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func WevpnHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -} diff --git a/internal/configuration/settings/validation/windscribe.go b/internal/configuration/settings/validation/windscribe.go deleted file mode 100644 index 4aab0e59..00000000 --- a/internal/configuration/settings/validation/windscribe.go +++ /dev/null @@ -1,27 +0,0 @@ -package validation - -import "github.com/qdm12/gluetun/internal/models" - -func WindscribeRegionChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Region - } - return makeUnique(choices) -} - -func WindscribeCityChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].City - } - return makeUnique(choices) -} - -func WindscribeHostnameChoices(servers []models.Server) (choices []string) { - choices = make([]string, len(servers)) - for i := range servers { - choices[i] = servers[i].Hostname - } - return makeUnique(choices) -}