From bbfc539051efa09d05fe67d1bb5f47e7611de133 Mon Sep 17 00:00:00 2001 From: tdakkota Date: Thu, 15 Dec 2022 04:37:20 +0300 Subject: [PATCH 1/3] feat(ogenregex): add helper to wrap compiled regexp --- ogenregex/ogenregex.go | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/ogenregex/ogenregex.go b/ogenregex/ogenregex.go index 4cc0f7e56..bc40817db 100644 --- a/ogenregex/ogenregex.go +++ b/ogenregex/ogenregex.go @@ -22,35 +22,45 @@ var _ = []Regexp{ } type goRegexp struct { - exp *regexp.Regexp + re *regexp.Regexp +} + +// Go returns wrapper for Go's regexp. +func Go(re *regexp.Regexp) Regexp { + return goRegexp{re} } func (r goRegexp) Match(s []byte) (bool, error) { - return r.exp.Match(s), nil + return r.re.Match(s), nil } func (r goRegexp) MatchString(s string) (bool, error) { - return r.exp.MatchString(s), nil + return r.re.MatchString(s), nil } func (r goRegexp) String() string { - return r.exp.String() + return r.re.String() } type regexp2Regexp struct { - exp *regexp2.Regexp + re *regexp2.Regexp +} + +// Regexp2 returns wrapper for dlclark/regexp2. +func Regexp2(re *regexp2.Regexp) Regexp { + return regexp2Regexp{re} } func (r regexp2Regexp) Match(s []byte) (bool, error) { - return r.exp.MatchRunes([]rune(string(s))) + return r.re.MatchRunes([]rune(string(s))) } func (r regexp2Regexp) MatchString(s string) (bool, error) { - return r.exp.MatchString(s) + return r.re.MatchString(s) } func (r regexp2Regexp) String() string { - return r.exp.String() + return r.re.String() } // Regexp is a regular expression interface. @@ -63,11 +73,11 @@ type Regexp interface { // Compile compiles a regular expression. // // NOTE: this function may compile the same expression multiple times and can -// be slow. Compile the expression once and reuse it. +// be slow. Call it once and reuse the result. func Compile(exp string) (Regexp, error) { if converted, ok := Convert(exp); ok { if re, err := regexp.Compile(converted); err == nil { - return goRegexp{re}, nil + return Go(re), nil } } re, err := regexp2.Compile(exp, regexp2.ECMAScript|regexp2.Unicode) @@ -77,7 +87,7 @@ func Compile(exp string) (Regexp, error) { // FIXME(tdakkota): Default timeout is "forever", which may lead to DoS. // Probably, we should make this configurable. re.MatchTimeout = 15 * time.Second - return regexp2Regexp{re}, nil + return Regexp2(re), nil } // MustCompile compiles a regular expression and panics on error. From 65abbdfeaf7b3a74cec6d9496ef15d3f6d181366 Mon Sep 17 00:00:00 2001 From: tdakkota Date: Thu, 15 Dec 2022 04:37:40 +0300 Subject: [PATCH 2/3] feat(gen): add `OverrideRegexp` function --- gen/_template/globals.tmpl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gen/_template/globals.tmpl b/gen/_template/globals.tmpl index c1e163a8e..ba42e7121 100644 --- a/gen/_template/globals.tmpl +++ b/gen/_template/globals.tmpl @@ -8,6 +8,16 @@ var regexMap = map[string]ogenregex.Regexp{ {{ quote $regex }}: ogenregex.MustCompile({{ quote $regex }}), {{- end }} } + +// OverrideRegexp allows to override regexes used in generated code. +// Returns true if regex was overridden, false otherwise. +// +// NOTE: this function MUST be called before any generated code is executed. +func OverrideRegexp(key string, r ogenregex.Regexp) (ok bool) { + _, ok = regexMap[key] + regexMap[key] = r + return ok +} {{- end }} {{- with $ratStrings := $.RatStrings }} From 8af27749f7971feae9884ab6af5e9e606f93d666 Mon Sep 17 00:00:00 2001 From: tdakkota Date: Thu, 15 Dec 2022 04:42:23 +0300 Subject: [PATCH 3/3] chore: commit generated files --- examples/ex_github/oas_cfg_gen.go | 11 +++++++++++ examples/ex_k8s/oas_cfg_gen.go | 11 +++++++++++ examples/ex_openapi/output.gen.go | 10 ++++++++++ internal/integration/sample_api/oas_cfg_gen.go | 11 +++++++++++ internal/integration/sample_api_nc/oas_cfg_gen.go | 11 +++++++++++ internal/integration/sample_api_ns/oas_cfg_gen.go | 11 +++++++++++ internal/integration/sample_api_nsnc/oas_cfg_gen.go | 11 +++++++++++ internal/integration/test_allof/oas_cfg_gen.go | 11 +++++++++++ internal/integration/test_anyof/oas_cfg_gen.go | 11 +++++++++++ 9 files changed, 98 insertions(+) diff --git a/examples/ex_github/oas_cfg_gen.go b/examples/ex_github/oas_cfg_gen.go index c82fcd506..45e643447 100644 --- a/examples/ex_github/oas_cfg_gen.go +++ b/examples/ex_github/oas_cfg_gen.go @@ -24,6 +24,17 @@ var regexMap = map[string]ogenregex.Regexp{ "^[0-9a-fA-F]+$": ogenregex.MustCompile("^[0-9a-fA-F]+$"), "^ssh-(rsa|dss|ed25519) |^ecdsa-sha2-nistp(256|384|521) ": ogenregex.MustCompile("^ssh-(rsa|dss|ed25519) |^ecdsa-sha2-nistp(256|384|521) "), } + +// OverrideRegexp allows to override regexes used in generated code. +// Returns true if regex was overridden, false otherwise. +// +// NOTE: this function MUST be called before any generated code is executed. +func OverrideRegexp(key string, r ogenregex.Regexp) (ok bool) { + _, ok = regexMap[key] + regexMap[key] = r + return ok +} + var ( // Allocate option closure once. clientSpanKind = trace.WithSpanKind(trace.SpanKindClient) diff --git a/examples/ex_k8s/oas_cfg_gen.go b/examples/ex_k8s/oas_cfg_gen.go index d901d62a6..858904563 100644 --- a/examples/ex_k8s/oas_cfg_gen.go +++ b/examples/ex_k8s/oas_cfg_gen.go @@ -20,6 +20,17 @@ import ( var regexMap = map[string]ogenregex.Regexp{ "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$": ogenregex.MustCompile("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"), } + +// OverrideRegexp allows to override regexes used in generated code. +// Returns true if regex was overridden, false otherwise. +// +// NOTE: this function MUST be called before any generated code is executed. +func OverrideRegexp(key string, r ogenregex.Regexp) (ok bool) { + _, ok = regexMap[key] + regexMap[key] = r + return ok +} + var ( // Allocate option closure once. clientSpanKind = trace.WithSpanKind(trace.SpanKindClient) diff --git a/examples/ex_openapi/output.gen.go b/examples/ex_openapi/output.gen.go index 0944be3fe..a6b618ba3 100644 --- a/examples/ex_openapi/output.gen.go +++ b/examples/ex_openapi/output.gen.go @@ -22,6 +22,16 @@ var regexMap = map[string]ogenregex.Regexp{ "^x-": ogenregex.MustCompile("^x-"), } +// OverrideRegexp allows to override regexes used in generated code. +// Returns true if regex was overridden, false otherwise. +// +// NOTE: this function MUST be called before any generated code is executed. +func OverrideRegexp(key string, r ogenregex.Regexp) (ok bool) { + _, ok = regexMap[key] + regexMap[key] = r + return ok +} + type Any jx.Raw // Ref: #/definitions/anysOrExpressions diff --git a/internal/integration/sample_api/oas_cfg_gen.go b/internal/integration/sample_api/oas_cfg_gen.go index 96f826589..5c0302ce0 100644 --- a/internal/integration/sample_api/oas_cfg_gen.go +++ b/internal/integration/sample_api/oas_cfg_gen.go @@ -24,6 +24,17 @@ var regexMap = map[string]ogenregex.Regexp{ "foo[^\r\n\u2028\u2029]*": ogenregex.MustCompile("foo[^\r\n\u2028\u2029]*"), "string_[^\r\n\u2028\u2029]*": ogenregex.MustCompile("string_[^\r\n\u2028\u2029]*"), } + +// OverrideRegexp allows to override regexes used in generated code. +// Returns true if regex was overridden, false otherwise. +// +// NOTE: this function MUST be called before any generated code is executed. +func OverrideRegexp(key string, r ogenregex.Regexp) (ok bool) { + _, ok = regexMap[key] + regexMap[key] = r + return ok +} + var ratMap = map[string]*big.Rat{ "10": func() *big.Rat { r, ok := new(big.Rat).SetString("10") diff --git a/internal/integration/sample_api_nc/oas_cfg_gen.go b/internal/integration/sample_api_nc/oas_cfg_gen.go index 7269c6790..983a62232 100644 --- a/internal/integration/sample_api_nc/oas_cfg_gen.go +++ b/internal/integration/sample_api_nc/oas_cfg_gen.go @@ -23,6 +23,17 @@ var regexMap = map[string]ogenregex.Regexp{ "foo[^\r\n\u2028\u2029]*": ogenregex.MustCompile("foo[^\r\n\u2028\u2029]*"), "string_[^\r\n\u2028\u2029]*": ogenregex.MustCompile("string_[^\r\n\u2028\u2029]*"), } + +// OverrideRegexp allows to override regexes used in generated code. +// Returns true if regex was overridden, false otherwise. +// +// NOTE: this function MUST be called before any generated code is executed. +func OverrideRegexp(key string, r ogenregex.Regexp) (ok bool) { + _, ok = regexMap[key] + regexMap[key] = r + return ok +} + var ratMap = map[string]*big.Rat{ "10": func() *big.Rat { r, ok := new(big.Rat).SetString("10") diff --git a/internal/integration/sample_api_ns/oas_cfg_gen.go b/internal/integration/sample_api_ns/oas_cfg_gen.go index 40e608934..03cbe86aa 100644 --- a/internal/integration/sample_api_ns/oas_cfg_gen.go +++ b/internal/integration/sample_api_ns/oas_cfg_gen.go @@ -22,6 +22,17 @@ var regexMap = map[string]ogenregex.Regexp{ "foo[^\r\n\u2028\u2029]*": ogenregex.MustCompile("foo[^\r\n\u2028\u2029]*"), "string_[^\r\n\u2028\u2029]*": ogenregex.MustCompile("string_[^\r\n\u2028\u2029]*"), } + +// OverrideRegexp allows to override regexes used in generated code. +// Returns true if regex was overridden, false otherwise. +// +// NOTE: this function MUST be called before any generated code is executed. +func OverrideRegexp(key string, r ogenregex.Regexp) (ok bool) { + _, ok = regexMap[key] + regexMap[key] = r + return ok +} + var ratMap = map[string]*big.Rat{ "10": func() *big.Rat { r, ok := new(big.Rat).SetString("10") diff --git a/internal/integration/sample_api_nsnc/oas_cfg_gen.go b/internal/integration/sample_api_nsnc/oas_cfg_gen.go index ceb9c777a..5d538b653 100644 --- a/internal/integration/sample_api_nsnc/oas_cfg_gen.go +++ b/internal/integration/sample_api_nsnc/oas_cfg_gen.go @@ -14,6 +14,17 @@ var regexMap = map[string]ogenregex.Regexp{ "foo[^\r\n\u2028\u2029]*": ogenregex.MustCompile("foo[^\r\n\u2028\u2029]*"), "string_[^\r\n\u2028\u2029]*": ogenregex.MustCompile("string_[^\r\n\u2028\u2029]*"), } + +// OverrideRegexp allows to override regexes used in generated code. +// Returns true if regex was overridden, false otherwise. +// +// NOTE: this function MUST be called before any generated code is executed. +func OverrideRegexp(key string, r ogenregex.Regexp) (ok bool) { + _, ok = regexMap[key] + regexMap[key] = r + return ok +} + var ratMap = map[string]*big.Rat{ "10": func() *big.Rat { r, ok := new(big.Rat).SetString("10") diff --git a/internal/integration/test_allof/oas_cfg_gen.go b/internal/integration/test_allof/oas_cfg_gen.go index 3c502ab84..6452df88e 100644 --- a/internal/integration/test_allof/oas_cfg_gen.go +++ b/internal/integration/test_allof/oas_cfg_gen.go @@ -20,6 +20,17 @@ import ( var regexMap = map[string]ogenregex.Regexp{ "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$": ogenregex.MustCompile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"), } + +// OverrideRegexp allows to override regexes used in generated code. +// Returns true if regex was overridden, false otherwise. +// +// NOTE: this function MUST be called before any generated code is executed. +func OverrideRegexp(key string, r ogenregex.Regexp) (ok bool) { + _, ok = regexMap[key] + regexMap[key] = r + return ok +} + var ( // Allocate option closure once. clientSpanKind = trace.WithSpanKind(trace.SpanKindClient) diff --git a/internal/integration/test_anyof/oas_cfg_gen.go b/internal/integration/test_anyof/oas_cfg_gen.go index bb332e72a..dcd495bbe 100644 --- a/internal/integration/test_anyof/oas_cfg_gen.go +++ b/internal/integration/test_anyof/oas_cfg_gen.go @@ -20,6 +20,17 @@ import ( var regexMap = map[string]ogenregex.Regexp{ "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$": ogenregex.MustCompile("^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$"), } + +// OverrideRegexp allows to override regexes used in generated code. +// Returns true if regex was overridden, false otherwise. +// +// NOTE: this function MUST be called before any generated code is executed. +func OverrideRegexp(key string, r ogenregex.Regexp) (ok bool) { + _, ok = regexMap[key] + regexMap[key] = r + return ok +} + var ( // Allocate option closure once. clientSpanKind = trace.WithSpanKind(trace.SpanKindClient)