Skip to content

Commit 37e0f6b

Browse files
committed
Rework getValueForNumber to also cache where invalid prefix has missing data
1 parent b8a88b8 commit 37e0f6b

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
@@ -3405,48 +3405,41 @@ func GetTimezonesForNumber(number *PhoneNumber) ([]string, error) {
34053405
return GetTimezonesForPrefix(e164)
34063406
}
34073407

3408-
func fillLangMap(langMap map[string]*intStringMap, dataFS embed.FS, dir, language string) (bool, error) {
3408+
func lazyLoadPrefixes(langMap map[string]*intStringMap, dataFS embed.FS, dir, language string) (*intStringMap, error) {
34093409
dataLoadMutex.Lock()
34103410
defer dataLoadMutex.Unlock()
34113411

3412-
_, ok := langMap[language]
3412+
// if we already have prefixes (or nil if they don't exist) return that
3413+
prefixes, ok := langMap[language]
34133414
if ok {
3414-
return true, nil
3415+
return prefixes, nil
34153416
}
34163417

3417-
// do we have data for this language
3418+
// try to load the data file for this language
34183419
data, err := dataFS.ReadFile(dir + "/" + language + ".txt.gz")
3419-
if err != nil {
3420-
if errors.Is(err, fs.ErrNotExist) {
3421-
return false, nil
3422-
}
3423-
3424-
return false, err
3420+
if err != nil && !errors.Is(err, fs.ErrNotExist) {
3421+
return nil, err
34253422
}
34263423

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

3435-
return false, err
3434+
return langMap[language], nil
34363435
}
34373436

34383437
func getValueForNumber(langMap map[string]*intStringMap, dataFS embed.FS, dir, language string, maxLength int, number *PhoneNumber) (string, int, error) {
3439-
ok, err := fillLangMap(langMap, dataFS, dir, language)
3440-
if !ok || err != nil {
3438+
prefixes, err := lazyLoadPrefixes(langMap, dataFS, dir, language)
3439+
if err != nil || prefixes == nil {
34413440
return "", 0, err
34423441
}
34433442

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

34523445
l := len(e164)
@@ -3458,7 +3451,7 @@ func getValueForNumber(langMap map[string]*intStringMap, dataFS embed.FS, dir, l
34583451
if err != nil {
34593452
return "", 0, err
34603453
}
3461-
if value, has := prefixMap.Map[index]; has {
3454+
if value, has := prefixes.Map[index]; has {
34623455
return value, index, nil
34633456
}
34643457
}

0 commit comments

Comments
 (0)