Skip to content

wolfogre/gtag

Repository files navigation

gtag

gtag logo

Go Reference Actions Codecov Go Report Card GitHub go.mod Go version GitHub tag (latest by date)

Help you to get golang struct's tags elegantly.

Quick start

1. Define your struct

A source file user.go:

package tutorial

type User struct {
	Id    int    `bson:"_id"`
	Name  string `bson:"name"`
	Email string `bson:"email"`
}

2. Run gtag

Run

go run github.com/wolfogre/gtag/cmd/gtag -types User -tags bson .

and you will get file user_tag.go:

// Code generated by gtag. DO NOT EDIT.
// See: https://github.com/wolfogre/gtag

//go:generate go run github.com/wolfogre/gtag/cmd/gtag -types User -tags bson .
package tutorial

import (
	"reflect"
	"strings"
)

var (
	// ...
)

// UserTags indicate tags of type User
type UserTags struct {
	Id    string // `bson:"_id"`
	Name  string // `bson:"name"`
	Email string // `bson:"email"`
}

// Tags return specified tags of User
func (*User) Tags(tag string, convert ...func(string) string) UserTags {
	conv := func(in string) string { return strings.TrimSpace(strings.Split(in, ",")[0]) }
	if len(convert) > 0 {
		conv = convert[0]
	}
	if conv == nil {
		conv = func(in string) string { return in }
	}
	return UserTags{
		Id:    conv(tagOfUserId.Get(tag)),
		Name:  conv(tagOfUserName.Get(tag)),
		Email: conv(tagOfUserEmail.Get(tag)),
	}
}

// TagsBson is alias of Tags("bson")
func (*User) TagsBson() UserTags {
	var v *User
	return v.Tags("bson")
}

3. Use it

Now you can use the generated code to get tags elegantly:

// update mongo document
obj := User{}
tags := obj.TagsBson()

_, err := collection.UpdateOne(
    ctx,
    bson.M{tags.Id: id},
    bson.M{
        "$set", bson.M{
            tags.Name: name,
            tags.Email: email,
        },
    },
)

Project status

Gtag is beta and is considered feature complete.