Go validators generator
Go lang methods generator from Open API 3 specification
Components
- generate - generates methods to validate as a .go files
- validate - validates requests basing on schemas generated by generator
Install
go get github.com/beng90/spec2go
Usage
Generating validation schemas from Open API specification
spec2go
Example
Generated file
package openapi
import (
"context"
"github.com/beng90/spec2go/validate"
"gopkg.in/go-playground/validator.v9"
"net/http"
)
type ValidationRule struct {
Field string
Rule string
Pattern *string
}
var AddOfferValidateRules = []ValidationRule{
{"additionalInfo", "omitempty", nil},
{"additionalInfo[].id", "omitempty,string", nil},
{"additionalInfo[].valuesIds", "omitempty", nil},
{"additionalInfo[].valuesIds[]", "omitempty,string", nil},
{"brand", "omitempty,string", nil},
{"categoryId", "required,string,max=16", nil},
{"defaultLanguage", "omitempty,string,min=2,max=2", nil},
{"productName", "required,string,min=1,max=255", nil},
{"variants", "required", nil},
{"variants[].content", "required", nil},
{"variants[].content[].description", "required,string,min=1,max=1024", nil},
{"variants[].content[].language", "required,string,min=2,max=2", nil},
{"variants[].delivery", "required", nil},
{"variants[].delivery.additionalInfo", "omitempty,string", nil},
{"variants[].delivery.dispatchTime", "required,integer,min=1,max=64", nil},
{"variants[].delivery.shippingTemplateId", "required,string,uuid", nil},
{"variants[].ean", "omitempty,string,min=13,max=13", nil},
{"variants[].inventory", "required", nil},
{"variants[].inventory.size", "required,integer,min=1,max=4294967295", nil},
{"variants[].isEnabled", "required,boolean", nil},
{"variants[].media", "required", nil},
{"variants[].media.images", "required", nil},
{"variants[].media.images[].sortOrder", "omitempty,integer,min=1,max=64", nil},
{"variants[].media.images[].url", "required,string,url,max=255", nil},
{"variants[].price", "required,string", nil},
{"variants[].sku", "omitempty,string", nil},
{"variants[].tags", "omitempty", nil},
{"variants[].tags[].id", "omitempty,string", nil},
{"variants[].tags[].valueId", "omitempty,string", nil},
}
func AddOfferValidate(v *validator.Validate, req *http.Request, ctx context.Context) error {
schemaValidator, err := validate.NewSchemaValidator(v, req, ctx)
if err != nil {
return err
}
for _, vRule := range AddOfferValidateRules {
schemaValidator.AddRule(vRule.Field, vRule.Rule, vRule.Pattern)
}
err = schemaValidator.Validate()
return err
}
Using in code
Working example available in example/ directory.
cd example
go run .
Result
[Field 'variants[0].isEnabled' failed in 'required' rule]
[Field 'variants[0].price' failed in 'required' rule]
[Field 'variants[0].inventory.size' failed in 'required' rule]
[Field 'variants[0].delivery' failed in 'required' rule]
[Field 'variants[0].media' failed in 'required' rule]
[Field 'productName' failed in 'required' rule]
[Field 'variants[0].content' failed in 'required' rule]