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 }