From 99e244fa925e396309c438582ebac66f928ef1a5 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Wed, 11 Dec 2024 21:44:34 -0500 Subject: [PATCH] providers: Add validation functions --- providers/all.go | 4 +-- providers/validate/strings.go | 7 +++++ providers/validate/validate.go | 47 ++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 providers/validate/strings.go create mode 100644 providers/validate/validate.go diff --git a/providers/all.go b/providers/all.go index 8d528ea..774c21c 100644 --- a/providers/all.go +++ b/providers/all.go @@ -5,9 +5,9 @@ import fpos "git.tebibyte.media/sashakoshka/step/providers/os" import fphttp "git.tebibyte.media/sashakoshka/step/providers/http" import fppath "git.tebibyte.media/sashakoshka/step/providers/path" import fpmime "git.tebibyte.media/sashakoshka/step/providers/mime" -import fpslice "git.tebibyte.media/sashakoshka/step/providers/slice" import fpsprig "git.tebibyte.media/sashakoshka/step/providers/sprig" import fpimport "git.tebibyte.media/sashakoshka/step/providers/import" +import fpvalidate "git.tebibyte.media/sashakoshka/step/providers/validate" import fpmarkdown "git.tebibyte.media/sashakoshka/step/providers/markdown" // All returns a slice of all providers defined in sub-packages. @@ -17,9 +17,9 @@ func All () []step.Provider { new(fphttp.Provider), new(fppath.Provider), new(fpmime.Provider), - new(fpslice.Provider), new(fpsprig.Provider), new(fpimport.Provider), + new(fpvalidate.Provider), fpmarkdown.Default(), } } diff --git a/providers/validate/strings.go b/providers/validate/strings.go new file mode 100644 index 0000000..c74e38d --- /dev/null +++ b/providers/validate/strings.go @@ -0,0 +1,7 @@ +package validate + +import "regexp" + +// see: +// https://stackoverflow.com/questions/201323/how-can-i-validate-an-email-address-using-a-regular-expression +var defaultEmailRegexp = regexp.MustCompile("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])") diff --git a/providers/validate/validate.go b/providers/validate/validate.go new file mode 100644 index 0000000..3cc9994 --- /dev/null +++ b/providers/validate/validate.go @@ -0,0 +1,47 @@ +package validate + +import "regexp" +import "html/template" +import "git.tebibyte.media/sashakoshka/step" + +var _ step.FuncProvider = new(Provider) +var _ step.Configurable = new(Provider) + +// Provider provides validation functions. +type Provider struct { + emailRegexp *regexp.Regexp +} + +// Package fulfills the step.Provider interface. +func (this *Provider) Package () string { + return "validate" +} + +func (this *Provider) Configure (config step.Meta) error { + emailRegexpText := config.Get("validate.email-regexp") + this.emailRegexp = nil + if emailRegexpText != "" { + emailRegexp, err := regexp.Compile(emailRegexpText) + if err != nil { return err } + this.emailRegexp = emailRegexp + } + return nil +} + +// FuncMap fulfills the step.FuncProvider interface. +func (this *Provider) FuncMap () template.FuncMap { + return template.FuncMap { + "isEmail": this.funcIsEmail, + "inRange": this.funcInRange, + } +} + +func (this *Provider) funcIsEmail (input string) bool { + emailRegexp := this.emailRegexp + if emailRegexp == nil { emailRegexp = defaultEmailRegexp } + return emailRegexp.Match([]byte(input)) +} + +func (this *Provider) funcInRange (min, max, value int) bool { + return value >= min && value <= max +}