providers: Add validation functions

This commit is contained in:
Sasha Koshka 2024-12-11 21:44:34 -05:00
parent 588061e3e0
commit 99e244fa92
3 changed files with 56 additions and 2 deletions

View File

@ -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(),
}
}

View File

@ -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])+)\\])")

View File

@ -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
}