From 0d7fd387a69cce6663b14b31860b69580cffd34e Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Sun, 22 Aug 2021 03:35:48 +0100 Subject: [PATCH] docs(examples): add a basic and a more complex example in examples dir --- examples/basic/basic.go | 38 +++++++++++++ examples/complex/complex.go | 110 ++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 examples/basic/basic.go create mode 100644 examples/complex/complex.go diff --git a/examples/basic/basic.go b/examples/basic/basic.go new file mode 100644 index 0000000..de61878 --- /dev/null +++ b/examples/basic/basic.go @@ -0,0 +1,38 @@ +package main + +import ( + "fmt" + + "github.com/romdo/go-validate" +) + +type Order struct { + Books []*Book `json:"books"` +} + +type Book struct { + Title string `json:"title"` + Author string `json:"author"` +} + +func (s *Book) Validate() error { + var errs error + if s.Title == "" { + errs = validate.Append(errs, &validate.Error{ + Field: "Title", Msg: "is required", + }) + } + + // Helper to perform the same kind of check as above for Title. + errs = validate.Append(errs, validate.RequireField("Author", s.Author)) + + return errs +} + +func main() { + errs := validate.Validate(&Order{Books: []*Book{{Title: ""}}}) + + for _, err := range validate.Errors(errs) { + fmt.Println(err.Error()) + } +} diff --git a/examples/complex/complex.go b/examples/complex/complex.go new file mode 100644 index 0000000..21cac7b --- /dev/null +++ b/examples/complex/complex.go @@ -0,0 +1,110 @@ +package main + +import ( + "fmt" + + "github.com/romdo/go-validate" +) + +type Manifest struct { + Spec *Spec `json:"spec"` +} + +func (s *Manifest) Validate() error { + return validate.RequireField("Spec", s.Spec) +} + +type Spec struct { + Containers []*Container `json:"containers"` + Images []*Image `json:"images"` +} + +func (s *Spec) Validate() error { + var errs error + + if len(s.Containers) == 0 { + errs = validate.AppendFieldError(errs, + "Containers", "must contain at least one item", + ) + } else { + imgs := map[string]bool{} + for _, img := range s.Images { + if img.Name != "" { + imgs[img.Name] = true + } + } + for i, c := range s.Containers { + if c.ImageRef != "" && !imgs[c.ImageRef] { + errs = validate.Append(errs, &validate.Error{ + Field: fmt.Sprintf("containers.%d.imageRef", i), + Msg: fmt.Sprintf( + "image with name '%s' not found", c.ImageRef, + ), + }) + } + } + } + + if len(s.Images) == 0 { + errs = validate.AppendFieldError(errs, + "Images", "must contain at least one item", + ) + } + + return errs +} + +type Container struct { + Name string `json:"name"` + ImageRef string `json:"imageRef"` +} + +func (s *Container) Validate() error { + var errs error + errs = validate.Append(errs, validate.RequireField("Name", s.Name)) + errs = validate.Append(errs, validate.RequireField("ImageRef", s.ImageRef)) + + return errs +} + +type Image struct { + Name string `json:"name"` + URI string `json:"uri"` + Tag string `json:"tag"` +} + +func (s *Image) Validate() error { + var errs error + errs = validate.Append(errs, validate.RequireField("Name", s.Name)) + errs = validate.Append(errs, validate.RequireField("URI", s.URI)) + errs = validate.Append(errs, validate.RequireField("Tag", s.Tag)) + + return errs +} + +func main() { + manifest := &Manifest{ + Spec: &Spec{ + Containers: []*Container{ + { + ImageRef: "server", + }, + { + Name: "worker", + ImageRef: "myServer", + }, + }, + Images: []*Image{ + { + Name: "server", + }, + }, + }, + } + + errs := validate.Validate(manifest) + + for _, err := range validate.Errors(errs) { + fmt.Println(err) + } +}