Skip to content

moritz-tiesler/pargo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pargo

A package for generating new struct definitions for types that use validator tags.

Validate once and use the new types that encode a successful validation.

Installation

go get github.com/moritz-tiesler/pargo@latest

Example

Create a go file that will call pargo

$ mkdir generator
$ cd generator && touch generate.go
// generator/generate.go
package main

import (
	"fmt"
	"log"

	"github.com/moritz-tiesler/pargo/pkg/generator"
)

func main() {
	gen := generator.Generator{}

	fmt.Println("invoking pargo generator")
	newFile, err := gen.Generate()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("file written: %s\n", newFile)
}

Create a file with your type definitions

$ mkdir models
$ cd models && touch user.go
// models/user.go
package models

import (
	"time"

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

// set up you validator once for the package. Its name must be 'VALIDATE'
// The generated code will reference this validator.
var VALIDATE = validator.New(validator.WithRequiredStructEnabled())

// point the go generate command to your generate.go file
//go:generate go run ../generator/generate.go
type Userstruct struct {
	Email          string    `json:"email" validate:"required,email"`
	Password       string    `json:"password" validate:"required,min=8"`
	DisplayName    string    `json:"displayName" validate:"required,min=2,max=50"`
	DateOfBirthStr string    `json:"dateOfBirth" validate:"required"`
	TagsStr        []string  `json:"tags"`
	SecretKey      string    `json:"-"`
	LastLoginTime  time.Time `json:"lastLogin"`
	Adress         Adress    `validate:"required"`
}

type Adress struct {
	Country string `validate:"required"`
	Street  string `validate:"required"`
	Zipcode string `validate:"required"`
}

Run go generate in your project root

go generate ./...

A file will be created in the models/ directory

$ ls models
user.go  user_gen.go

Use the new types definitions

// main.go
package main

import (
	"fmt"
	"pargo_use/models"
)

func main() {
	u := models.Userstruct{
		DisplayName:    "Bob",
		Email:          "bob@bobnet.com",
		Password:       "s3cr3T",
		DateOfBirthStr: "01.01.2000",
		Adress: models.Adress{
			Country: "England",
		},
	}

	if uv, err := u.ToUserstructValidated(); err != nil {
		fmt.Printf("error validating %+v, err=%s\n", u, err)
	} else {
		fmt.Printf("validated user %+v", uv)
	}
}

About

Parse, don't validate

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages