defaults

package module
v1.2.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 13, 2025 License: MIT Imports: 10 Imported by: 0

README

go-defaults

Enabling stuctures with defaults values using struct tags.

Installation

The recommended way to install go-defaults

go get github.com/jc21/go-defaults

Examples

A basic example:

import (
    "fmt"
    "github.com/jc21/go-defaults"
    "time"
)

type ExampleBasic struct {
    Foo bool   `default:"true"` //<-- StructTag with a default key
    Bar string `default:"33"`
    Qux int8
    Dur time.Duration `default:"1m"`
}

func NewExampleBasic() *ExampleBasic {
    example := new(ExampleBasic)
    defaults.SetDefaults(example) //<-- This set the defaults values

    return example
}

...

test := NewExampleBasic()
fmt.Println(test.Foo) //Prints: true
fmt.Println(test.Bar) //Prints: 33
fmt.Println(test.Qux) //Prints:
fmt.Println(test.Dur) //Prints: 1m0s

Caveats

At the moment, the way the default filler checks whether it should fill a struct field or not is by comparing the current field value with the corresponding zero value of that type. This has a subtle implication: the zero value set explicitly by you will get overriden by default value during SetDefaults() call. So if you need to set the field to container zero value, you need to set it explicitly AFTER setting the defaults.

Take the basic example in the above section and change it slightly:


example := ExampleBasic{
    Bar: 0,
}
defaults.SetDefaults(example)
fmt.Println(example.Bar) //Prints: 33 instead of 0 (which is zero value for int)

example.Bar = 0 // set needed zero value AFTER applying defaults
fmt.Println(example.Bar) //Prints: 0

License

MIT, see LICENSE

Documentation

Overview

This library allow to define a default value to any struct, this is made thanks to struct tags.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Factory

func Factory(variable any)

Factory ...

func SetDefaults

func SetDefaults(variable any)

SetDefaults Applies the default values to the struct object, the struct type must have the StructTag with name "default" and the directed value.

Usage

type ExampleBasic struct {
    Foo bool   `default:"true"`
    Bar string `default:"33"`
    Qux int8
    Dur time.Duration `default:"2m3s"`
}

 foo := &ExampleBasic{}
 SetDefaults(foo)

Types

type Defaults

type Defaults interface {
	Defaults(tagValue string) any
}

type FieldData

type FieldData struct {
	Field    reflect.StructField
	Value    reflect.Value
	TagValue string
	Parent   *FieldData
}

type Filler

type Filler struct {
	FuncByName map[string]FillerFunc
	FuncByType map[TypeHash]FillerFunc
	FuncByKind map[reflect.Kind]FillerFunc
	Tag        string
}

Filler contains all the functions to fill any struct field with any type allowing to define function by Kind, Type of field name

func (*Filler) Fill

func (f *Filler) Fill(variable any)

Fill apply all the functions contained on Filler, setting all the possible values

func (*Filler) GetFieldsFromValue

func (f *Filler) GetFieldsFromValue(valueObject reflect.Value, parent *FieldData) []*FieldData

GetFieldsFromValue ...

func (*Filler) SetDefaultValue

func (f *Filler) SetDefaultValue(field *FieldData)

SetDefaultValue ...

func (*Filler) SetDefaultValues

func (f *Filler) SetDefaultValues(fields []*FieldData)

SetDefaultValues ...

type FillerFunc

type FillerFunc func(field *FieldData)

type TypeHash

type TypeHash string

TypeHash is a string representing a reflect.Type following the next pattern: <package.name>.<type.name>

func GetTypeHash

func GetTypeHash(t reflect.Type) TypeHash

GetTypeHash returns the TypeHash for a given reflect.Type

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL