Skip to content

MordaTeam/go-config

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🛠️ go-config: Universal Configuration Library for Go

License Static Badge Coverage Status Go Reference Go Reference

go-config is a universal library for Go that simplifies working with configuration files and data from various sources. The library provides a flexible interface for loading, decoding, and merging configurations.

🌟 Key Features

  • Support for multiple data sources:

    • Command-line arguments
    • Consul KV
    • Environment variables
    • Files
    • Any object implementing the io.Reader interface
  • Flexibility in decoding:

    • Built-in JSON decoder
    • Ability to use third-party decoders (e.g., XML)
  • Configuration merging:

    • Loading configuration from multiple sources
    • Merging strategies: AllOf (all sources must succeed) and OneOf (at least one source succeeds)
  • Additional features:

    • Partial filling of existing structures
    • Simple integration into existing projects

📦 Installation

go get github.com/MordaTeam/go-config

🚀 Usage

Simple example: Reading configuration from io.Reader

type Config struct { Foo string `json:"foo"` Bar int `json:"bar"` } source := strings.NewReader(`{"foo": "hello", "bar": 42}`) cfg, err := config.New[Config](config.FromReader(source)) if err != nil { panic(err) } fmt.Printf("%+v\n", cfg) // Output: {Foo:hello Bar:42}

By default, the JSON decoder is used.


Using a different format (XML)

type Config struct { Sizes []string `xml:"size"` } source := strings.NewReader(` <sizes>  <size>small</size>  <size>regular</size>  <size>large</size> </sizes>`) cfg, err := config.New[Config]( config.FromReader(source), config.WithDecoder(xml.NewDecoder), ) if err != nil { panic(err) } fmt.Printf("%+v\n", cfg) // Output: {Sizes:[small regular large]}

Partially filling an existing configuration

If you already have a partially filled structure, you can fill it further:

type Config struct { Foo string `json:"foo"` Bar string `json:"bar"` } source := strings.NewReader(`{"bar": "hello"}`) cfg := Config{ Foo: "initialized", } if err := config.Fill(&cfg, config.FromReader(source)); err != nil { panic(err) } fmt.Printf("%+v\n", cfg) // Output: {Foo:initialized Bar:hello}

Merging configurations from multiple sources

type Config struct { Foo string `json:"foo"` Bar string `json:"bar"` Sizes []string `xml:"size"` } source1 := strings.NewReader(`{"foo": "hello", "bar": "world"}`) source2 := strings.NewReader(` <sizes>  <size>small</size>  <size>regular</size>  <size>large</size> </sizes>`) cfg, err := config.Multi[Config](). Add(config.FromReader(source1)). Add(config.FromReader(source2), config.WithDecoder(xml.NewDecoder)). AllOf() if err != nil { panic(err) } fmt.Printf("%+v\n", cfg) // Output: {Foo:hello Bar:world Sizes:[small regular large]}

The AllOf method requires successful reading from all sources. If at least one successful source is needed, use the OneOf method.


🛠️ API

Interfaces

  1. ConfigProvider:

    • Responsible for retrieving configuration from a specific source.
    • Implementations:
      • FromCmdline
      • FromConsul
      • FromEnv
      • FromFile
      • FromReader
      • NoProvider
  2. Decoder:

    • Responsible for converting configuration into the desired structure.
    • Supports custom decoders.

About

Simple and convenient library for working with app configurations.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages