tagly
GoLang tag toolbox

This library is compatible with Go 1.17+
Please refer to CHANGELOG.md if you encounter breaking changes.
Motivation
This project provides go struct tag utility to parse complex tags, alongside common tag functionality,
which includes a format tag
Usage
package example
import (
"reflect"
"time"
"log"
"fmt"
"github.com/viant/tagly/format"
)
type (
Bar struct {
Info string
}
Dummy struct {
ID string `format:"Id"`
At time.Time `format:"tz=UTC,dateFormat=YYYY-MM-DD hh:mm"`
Internal bool `format:"-"`
Bar `format:",inline"`
AttrX string `format:",caseFormat=upperdash"`
Other string `format:",inline,dateFormat=YYYY-MM-DD" json:"JsonCustomizedName"`
}
)
func ExampleOfFormatTag() {
tagValue := reflect.StructTag(`format:",inline,dateFormat=YYYY-MM-DD" json:"JsonCustomizedName"`)
tag, err := format.Parse(tagValue, "json")
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", tag)
}
package example
import (
"strings"
"fmt"
"github.com/viant/tagly/tags"
)
type Tag struct {
Name string
Setting1 string
Repeated []string
SettingN bool
}
func (t *Tag) updateTagKey(key, value string) error {
switch strings.ToLower(key) {
case "name":
t.Name = value
case "setting1":
t.Setting1 = value
case "settingn":
t.SettingN = value == "true" || value == ""
case "repeated":
t.Repeated = strings.Split(strings.Trim(value, "{}"), ",")
default:
return fmt.Errorf("unsupported tag: %s", key)
}
return nil
}
func ParseTag(tagString string) *Tag {
tag := &Tag{}
values := tags.Values(tagString)
name, values := values.Name()
tag.Name = name
_ = values.MatchPairs(tag.updateTagKey)
return tag
}
format tag
Case formatter
package example
import (
"fmt"
"github.com/viant/tagly/format/text"
)
func ExampleCaseFormatter() {
caseFormat := text.CaseFormatUpperUnderscore
formatter := caseFormat.To(text.CaseFormatLowerCamel)
formatted := formatter.Format("THIS_IS_TEST")
fmt.Printf("formatted: %s\n", formatted)
detected := text.DetectCaseFormat("candidate", "candidate_2")
fmt.Printf("detected: %s %v\n", detected, detected.IsDefined())
}
Numeric segments are preserved during case conversion, including after underscores.
For example, converting to lower camel case produces:
| Input |
Output |
SampleSeen_1Day |
sampleSeen1Day |
SampleSeen_7Day |
sampleSeen7Day |
SampleSeen_14Day |
sampleSeen14Day |
Compatibility note: earlier versions could drop the last digit after a separator,
producing names such as sampleSeen_Day or sampleSeen_1Day. Applications that
use formatted names as JSON keys must coordinate adoption with their clients.
Regenerate any explicit JSON tags derived from the affected names when upgrading.
Common tag:
Contributing to tagly
tagly is an open source project and contributors are welcome!
See TODO list
License
The source code is made available under the terms of the Apache License, Version 2, as stated in the file LICENSE.
Individual files may be made available under their own specific license,
all compatible with Apache License, Version 2. Please see individual files for details.
Credits and Acknowledgements
Library Author: Adrian Witas