Giter Site home page Giter Site logo

customdecode's Introduction

customdecode Travis-CI GoDoc

customdecode is a Go package for populating structs from any custom decoder function, e.g. AWS Secrets, Files, Environment Variables, etc...

customdecode uses struct tags to map variables derived from any custom function to fields, allowing you you use any names you want for custom variables. customdecode will recurse into nested structs, including pointers to nested structs, but it will not allocate new pointers to structs.

API

Full API docs are available on godoc.org.

Define a struct with custom struct tags:

type Config struct {
    Hostname  string `custom:"SERVER_HOSTNAME,default=localhost"`
    Port      uint16 `custom:"SERVER_PORT,default=8080"`

    AWS struct {
        ID        string   `custom:"AWS_ACCESS_KEY_ID"`
        Secret    string   `custom:"AWS_SECRET_ACCESS_KEY,required"`
        SnsTopics []string `custom:"AWS_SNS_TOPICS"`
    }

    Timeout time.Duration `custom:"TIMEOUT,default=1m,strict"`
}

Fields must be exported (i.e. begin with a capital letter) in order for customdecode to work with them. An error will be returned if a struct with no exported fields is decoded (including one that contains no custom tags at all). Default values may be provided by appending ",default=value" to the struct tag. Required values may be marked by appending ",required" to the struct tag. Strict values may be marked by appending ",strict" which will return an error on Decode if there is an error while parsing.

Then call customdecode.Decode:

func EnvDecode(s string) string {
  return os.Getenv(s)
}

var cfg Config
err := customdecode.Decode(&cfg, EnvDecode)

If you want all fields to act strict, you may use customdecode.StrictDecode:

func EnvDecode(s string) string {
  return os.Getenv(s)
}

var cfg Config
err := customdecode.StrictDecode(&cfg, EnvDecode)

All parse errors will fail fast and return an error in this mode.

Supported types

  • Structs (and pointer to structs)
  • Slices of below defined types, separated by semicolon
  • bool
  • float32, float64
  • int, int8, int16, int32, int64
  • uint, uint8, uint16, uint32, uint64
  • string
  • time.Duration, using the time.ParseDuration() format
  • *url.URL, using url.Parse()
  • Types those implement a Decoder interface

Custom Decoder

If you want a field to be decoded with custom behavior, you may implement the interface Decoder for the filed type.

type Config struct {
  IPAddr IP `env:"IP_ADDR"`
}

type IP net.IP

// Decode implements the interface `envdecode.Decoder`
func (i *IP) Decode(repl string) error {
  *i = net.ParseIP(repl)
  return nil
}

Decoder is the interface implemented by an object that can decode a custom variable string representation of itself.

customdecode's People

Contributors

svjard avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.