Skip to content

Formatter error response inspiration like express-validator in nodejs build on top go-playground-validator

License

Notifications You must be signed in to change notification settings

restuwahyu13/go-playground-converter

Repository files navigation

Go Playground Converter

GitHub go.mod Go version Go Report Card PRs Welcome

go-playground-converter is formatter error response inspiration like express-validator in Node.js. go-playground-converter builds on top of go-playground/validator, see more about struct references and follow this documentation, And for the new version of go-playground-converter, you can use custom messages using gpc struct tags, and you need the core go-playground/validator you can access use GoValidator.

Installation

$ go get -u github.com/restuwahyu13/go-playground-converter

Example Usage Without GPC Tags

  package main

  import (
  "fmt"
   gpc "github.com/restuwahyu13/go-playground-converter"
  )

  type Login struct {
  	Email    string `validate:"required" json:"email"`
  	Password string `validate:"required" json:"password"`
  }

  func main() {
  	payload := Login{Email: "", Password: ""}
  	res, err := gpc.Validator(payload) // if not errors, validator return res & err nil value

  	if err != nil {
  		panic(err)
  	}

  	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  		w.Header().Set("Content-Type", "application/json")
  		json.NewEncoder(w).Encode(&res)
  	})

  	http.ListenAndServe(":3000", nil)
  }

  // {
  //   "errors": [
  //     {
  //       "msg": "Email is a required field",
  //       "param": "Email",
  //       "tag": "required"
  //     },
  //     {
  //       "msg": "Password is a required field",
  //       "param": "Password",
  //       "tag": "required"
  //     }
  //   ]
  // }

Example Usage With GPC Tags

  package main

  import (
  "fmt"
   gpc "github.com/restuwahyu13/go-playground-converter"
  )

  type Login struct {
  	Email    string `validate:"required" gpc:"required=Email tidak boleh kosong" json:"email"`
  	Password string `validate:"required" gpc:"required=Password tidak boleh kosong" json:"password"`
  }

  func main() {
  	payload := Login{Email: "", Password: ""}
  	res, err := gpc.Validator(payload) // if not errors, validator return res & err nil value

  	if err != nil {
  		panic(err)
  	}

  	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  		w.Header().Set("Content-Type", "application/json")
  		json.NewEncoder(w).Encode(&res)
  	})

  	http.ListenAndServe(":3000", nil)
  }

  // {
  //   "errors": [
  //     {
  //       "msg": "Email tidak boleh kosong",
  //       "param": "Email",
  //       "tag": "required"
  //     },
  //     {
  //       "msg": "Password tidak boleh kosong",
  //       "param": "Password",
  //       "tag": "required"
  //     }
  //   ]
  // }

Example With Options

package main

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

	"github.com/go-playground/validator/v10"

	gpc "github.com/restuwahyu13/go-playground-converter"
)

  type Login struct {
  	Email    string `validate:"required" json:"email"`
  	Password string `validate:"required" json:"password"`
  }

  func main() {
  	payload := Login{Email: "", Password: ""}
  	res, err := gpc.Validator(payload, validator.WithRequiredStructEnabled()) // if not errors, validator return res & err nil value

  	if err != nil {
  		panic(err)
  	}

  	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  		w.Header().Set("Content-Type", "application/json")
  		json.NewEncoder(w).Encode(&res)
  	})

  	http.ListenAndServe(":3000", nil)
  }

  // {
  //   "errors": [
  //     {
  //       "msg": "Email is a required field",
  //       "param": "Email",
  //       "tag": "required"
  //     },
  //     {
  //       "msg": "Password is a required field",
  //       "param": "Password",
  //       "tag": "required"
  //     }
  //   ]
  // }

Example Custom Validation

func GoValidator(s interface{}) (*gpc.FormatError, error) {
 res, err := gpc.Validator(s) // <- pass your struct from param in here

 if err != nil {
   return nil, err
 }

  return res, nil
}

Example Custom Validation With Gorutine

func GoValidator(s interface{}) (*gpc.FormatError, error) {
	var (
		wg      *sync.WaitGroup       = new(sync.WaitGroup)
		errChan chan error            = make(chan error, 1)
		resChan chan *gpc.FormatError = make(chan *gpc.FormatError, 1)
	)

	wg.Add(1)

	go func() {
		defer wg.Done()

		res, err := gpc.Validator(s) // <- pass your struct from param in here
		if err != nil {
			errChan <- err
			resChan <- nil
		}

		if res != nil {
			errChan <- nil
			resChan <- res
		}
	}()

	defer close(errChan)
	defer close(resChan)

	wg.Wait()

	if err := <-errChan; err != nil {
		return nil, err
	}

	return <-resChan, nil
}

Testing

  • Testing Via Local

     go test --race -v --failfast .
  • Testing Via Docker

    docker build -t go-playground-converter --compress . && docker run go-playground-converter go test --race -v --failfast .

Bugs

For information on bugs related to package libraries, please visit here

Contributing

Want to make Go Playground Converter more perfect ? Let's contribute and follow the contribution guide.

License

BACK TO TOP

About

Formatter error response inspiration like express-validator in nodejs build on top go-playground-validator

Resources

License

Code of conduct

Stars

Watchers

Forks