diff --git a/internal/constants/servers.go b/internal/constants/servers.go index 6c09173a..9dc9dac2 100644 --- a/internal/constants/servers.go +++ b/internal/constants/servers.go @@ -1,29 +1,34 @@ package constants import ( - _ "embed" + "embed" "encoding/json" + "sync" "github.com/qdm12/gluetun/internal/models" ) //go:embed servers.json -var allServersBytes []byte //nolint:gochecknoglobals +var allServersEmbedFS embed.FS //nolint:gochecknoglobals var allServers models.AllServers //nolint:gochecknoglobals +var parseOnce sync.Once //nolint:gochecknoglobals func init() { //nolint:gochecknoinits // error returned covered by unit test - allServers, _ = parseAllServers(allServersBytes) + parseOnce.Do(func() { allServers, _ = parseAllServers() }) } -func parseAllServers(b []byte) (allServers models.AllServers, err error) { - err = json.Unmarshal(b, &allServers) +func parseAllServers() (allServers models.AllServers, err error) { + f, err := allServersEmbedFS.Open("servers.json") + if err != nil { + return allServers, err + } + decoder := json.NewDecoder(f) + err = decoder.Decode(&allServers) return allServers, err } -func GetAllServers() (allServers models.AllServers) { - if allServers.Version == 0 { // not parsed yet - for unit tests mostly - allServers, _ = parseAllServers(allServersBytes) - } +func GetAllServers() models.AllServers { + parseOnce.Do(func() { allServers, _ = parseAllServers() }) // init did not execute, used in tests return allServers } diff --git a/internal/constants/servers_test.go b/internal/constants/servers_test.go index 3b93ddba..890e7d45 100644 --- a/internal/constants/servers_test.go +++ b/internal/constants/servers_test.go @@ -15,7 +15,7 @@ import ( func Test_parseAllServers(t *testing.T) { t.Parallel() - servers, err := parseAllServers(allServersBytes) + servers, err := parseAllServers() require.NoError(t, err) require.NotEmpty(t, len(servers.Cyberghost.Servers))