Skip to content

Commit 23cec2c

Browse files
authored
Merge pull request #200 from nyaruka/data_load_tweak
Rework `getValueForNumber` to also cache for unknown languages
2 parents f13558b + 37e0f6b commit 23cec2c

File tree

1 file changed

+19
-26
lines changed

1 file changed

+19
-26
lines changed

phonenumbers.go

+19-26
Original file line numberDiff line numberDiff line change
@@ -3402,48 +3402,41 @@ func GetTimezonesForNumber(number *PhoneNumber) ([]string, error) {
34023402
return GetTimezonesForPrefix(e164)
34033403
}
34043404

3405-
func fillLangMap(langMap map[string]*intStringMap, dataFS embed.FS, dir, language string) (bool, error) {
3405+
func lazyLoadPrefixes(langMap map[string]*intStringMap, dataFS embed.FS, dir, language string) (*intStringMap, error) {
34063406
dataLoadMutex.Lock()
34073407
defer dataLoadMutex.Unlock()
34083408

3409-
_, ok := langMap[language]
3409+
// if we already have prefixes (or nil if they don't exist) return that
3410+
prefixes, ok := langMap[language]
34103411
if ok {
3411-
return true, nil
3412+
return prefixes, nil
34123413
}
34133414

3414-
// do we have data for this language
3415+
// try to load the data file for this language
34153416
data, err := dataFS.ReadFile(dir + "/" + language + ".txt.gz")
3416-
if err != nil {
3417-
if errors.Is(err, fs.ErrNotExist) {
3418-
return false, nil
3419-
}
3420-
3421-
return false, err
3417+
if err != nil && !errors.Is(err, fs.ErrNotExist) {
3418+
return nil, err
34223419
}
34233420

3424-
// load it into our map
3425-
prefixMap, err := loadPrefixMap(data)
3426-
if err == nil {
3427-
langMap[language] = prefixMap
3428-
3429-
return true, nil
3421+
if data != nil {
3422+
prefixes, err = loadPrefixMap(data)
3423+
if err != nil {
3424+
return nil, err
3425+
}
3426+
langMap[language] = prefixes
3427+
} else {
3428+
langMap[language] = nil // language doesn't have data
34303429
}
34313430

3432-
return false, err
3431+
return langMap[language], nil
34333432
}
34343433

34353434
func getValueForNumber(langMap map[string]*intStringMap, dataFS embed.FS, dir, language string, maxLength int, number *PhoneNumber) (string, int, error) {
3436-
ok, err := fillLangMap(langMap, dataFS, dir, language)
3437-
if !ok || err != nil {
3435+
prefixes, err := lazyLoadPrefixes(langMap, dataFS, dir, language)
3436+
if err != nil || prefixes == nil {
34383437
return "", 0, err
34393438
}
34403439

3441-
// do we have a map for this language?
3442-
prefixMap, ok := langMap[language]
3443-
if !ok {
3444-
return "", 0, fmt.Errorf("error loading language map for %s", language)
3445-
}
3446-
34473440
e164 := Format(number, E164)
34483441

34493442
l := len(e164)
@@ -3455,7 +3448,7 @@ func getValueForNumber(langMap map[string]*intStringMap, dataFS embed.FS, dir, l
34553448
if err != nil {
34563449
return "", 0, err
34573450
}
3458-
if value, has := prefixMap.Map[index]; has {
3451+
if value, has := prefixes.Map[index]; has {
34593452
return value, index, nil
34603453
}
34613454
}

0 commit comments

Comments
 (0)