code.gitea.io/gitea@v1.19.3/modules/regexplru/regexplru.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package regexplru
     5  
     6  import (
     7  	"regexp"
     8  
     9  	"code.gitea.io/gitea/modules/log"
    10  
    11  	lru "github.com/hashicorp/golang-lru"
    12  )
    13  
    14  var lruCache *lru.Cache
    15  
    16  func init() {
    17  	var err error
    18  	lruCache, err = lru.New(1000)
    19  	if err != nil {
    20  		log.Fatal("failed to new LRU cache, err: %v", err)
    21  	}
    22  }
    23  
    24  // GetCompiled works like regexp.Compile, the compiled expr or error is stored in LRU cache
    25  func GetCompiled(expr string) (r *regexp.Regexp, err error) {
    26  	v, ok := lruCache.Get(expr)
    27  	if !ok {
    28  		r, err = regexp.Compile(expr)
    29  		if err != nil {
    30  			lruCache.Add(expr, err)
    31  			return nil, err
    32  		}
    33  		lruCache.Add(expr, r)
    34  	} else {
    35  		r, ok = v.(*regexp.Regexp)
    36  		if !ok {
    37  			if err, ok = v.(error); ok {
    38  				return nil, err
    39  			}
    40  			panic("impossible")
    41  		}
    42  	}
    43  	return r, nil
    44  }