Awesome Go

gody

CategoryValidation
SubcategoryValidation
Stars0

:balloon: A lightweight struct validator for Go

About gody

gody

Mentioned in Awesome Go Last commit GoDoc Go Report Card Pipeline workflow Coverage Status GitHub release (latest by date)

Go versions supported

Installation

go get github.com/guiferpa/gody/v2

Usage

package main

import (
    "encoding/json"
    "fmt"
    "net/http"

    gody "github.com/guiferpa/gody/v2"
    "github.com/guiferpa/gody/v2/rule"
) 

type RequestBody struct {
    Name string `json:"name" validate:"not_empty"`
    Age  int    `json:"age" validate:"min=21"`
}

func HTTPHandler(v *gody.Validator) http.HandlerFunc {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        var body RequestBody
        if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
	    // ...
    	}
	defer r.Body.Close()

	if isValidated, err := v.Validate(body); err != nil {
	    // ...                                                                                
	}
    })
}

func main() {
    validator := gody.NewValidator()

    validator.AddRules(rule.NotEmpty, rule.Min)

    port := ":3000"
    http.ListenAndServe(port, HTTPHandler(validator))
}

Others ways for validation

There are others ways to valid a struct, take a look on functions below:

  • RawValidate - It's a function that make validate with no rule, it's necessary put the struct for validation, some rule(s) and tag name.
gody.RawValidate(interface{}, string, []gody.Rule) (bool, error)
  • Validate - It's a function that make validate with no rule, it's necessary put the struct for validation and some rule(s).
gody.Validate(interface{}, []gody.Rule) (bool, error)
  • RawDefaultValidate - It's a function that already have built-in rules configured, it's necessary put the struct for validation, tag name and optional custom rule(s).
gody.RawDefaultValidate(interface{}, string, []gody.Rule) (bool, error)
  • DefaultValidate - It's a function that already have built-in rules configured, it's necessary put the struct for validation and optional custom rule(s).
gody.DefaultValidate(interface{}, []gody.Rule) (bool, error)

Dynamic Enum Validation (No Duplication)

You can avoid duplicating enum values in struct tags by using dynamic parameters:

const (
    StatusCreated = "__CREATED__"
    StatusPending = "__PENDING__"
    StatusDoing   = "__DOING__"
    StatusDone    = "__DONE__"
)

type Task struct {
    Name   string `json:"name"`
    Status string `json:"status" validate:"enum={status}"`
}

validator := gody.NewValidator()
validator.AddRuleParameters(map[string]string{
    "status": fmt.Sprintf("%s,%s,%s,%s", StatusCreated, StatusPending, StatusDoing, StatusDone),
})
validator.AddRules(rule.Enum)

// Now you can validate Task structs without duplicating enum values in the tag!

Contribution policies

  1. At this time the only policy is don't create a Pull Request directly, it's necessary some discussions for some implementation then open an issue before to dicussion anything about the project.

Frequently Asked Questions

What is gody?

gody is a Validation library for the Go programming language. :balloon: A lightweight struct validator for Go

How do I install gody?

Install gody with the Go module system using `go get guiferpa/gody`. Check the repository for the current installation instructions.

What category does gody belong to?

gody is listed under Validation, specifically Validation.

← Back to Validation