ProductPromotion
Logo

Go.Lang

made by https://0x3d.site

GitHub - greencoda/confiq: Structured data format to config struct decoder library for Go
Structured data format to config struct decoder library for Go - greencoda/confiq
Visit Site

GitHub - greencoda/confiq: Structured data format to config struct decoder library for Go

GitHub - greencoda/confiq: Structured data format to config struct decoder library for Go

godoc for greencoda/confiq Go 1.22 Build Status Go Coverage Go Report card

confiq

confiq is a Go package for populating structs or arrays from structured data formats such JSON, TOML, YAML or Env, by using struct tags to map the loaded values to fields, using a selector path syntax which can traverse maps by keys and arrays by their indices.

The data can be loaded either from files, strings, byte arrays, readers and in case of environment variable formats from the actual environment.

Install

go get -u github.com/greencoda/confiq

Example

Provide the configuration data in a supported format:

config.json

{
    "serverHost": "http://localhost",
    "port": 8000,
    "settings": {
        "readOnlyMode": true,
        "maxConnections": 10,
        "disallowedUsernames": ["badUser1", "badUser2"]
    },
    "apiKeys": [
        "testKey1",
        "testKey2"
    ]
}

Create a new configSet using confiq.New and load the data with the appropriate Load method, depending on how you'd like to provide it. In this example we're loading it from the file system:

configSet := confiq.New()

if err := configSet.Load(
    confiqjson.Load().FromFile("./config.json"),
); err != nil {
    log.Fatal(err)
}

Define the config struct and provide the mappings in its struct tags for each field.

You may define certain fields to be required, or to have a default value if it isn't (these are mutually exclusive), or mark certain fields as strict which would cause the entire decoding process to fail if the value can not be set from the provided config data.

type Config struct {
	ServerHost          *url.URL `cfg:"serverHost,required"`
	ServerPort          string   `cfg:"port"`
	AllowedUsernames    []string `cfg:"settings.allowedUsernames,default=root;admin;developer"`
	DisallowedUsernames []string `cfg:"settings.disallowedUsernames"`
	ReadOnlyMode        bool     `cfg:"settings.readOnlyMode"`
	MaxConnections      int      `cfg:"settings.maxConnections"`
	ClientID            string   `cfg:"settings.clientId,default=defaultClient"`
	APIKey              string   `cfg:"apiKeys[1]"`
}

var config Config

Then decode the data to this struct from the loaded config data using Decode:

if err := configSet.Decode(&config); err != nil {
   // ...
}

You may also use confiq.AsStrict() option to have all fields act as if they were strict:

if err := configSet.Decode(&config, confiq.AsStrict()); err != nil {
   // ...
}

The result will be an instance of the struct loaded with data from the specified addresses of the config file:

(main.Config) {
 ServerHost: (*url.URL)(0xc0000e2090)(http://localhost),
 ServerPort: (string) (len=4) "8000",
 AllowedUsernames: ([]string) (len=3 cap=3) {
  (string) (len=4) "root",
  (string) (len=5) "admin",
  (string) (len=9) "developer"
 },
 DisallowedUsernames: ([]string) (len=2 cap=2) {
  (string) (len=8) "badUser1",
  (string) (len=8) "badUser2"
 },
 ReadOnlyMode: (bool) true,
 MaxConnections: (int) 10,
 ClientID: (string) (len=13) "defaultClient",
 APIKey: (string) (len=8) "testKey2"
}

Supported types:

confiq supports recursively decoding values into structs with exported fields, maps and slices.

Structs

  • structs with exported fields of other supported types

Maps

  • maps with primitive types for keys, and other supported types for values

Slices

  • slices of other supported types
  • strings will be split up at semicolons, and attempted to be decoded as slices of other supported types

Primitives

  • string
  • int, int8, int16, int32, int64
  • uint, uint8, uint16, uint32, uint64
  • float32, float64
  • bool

Other common types

  • json.RawMessage
  • net.IP
  • time.Duration
  • time.Time
  • *url.URL

Custom types

  • structs implementing the Decoder interface
  • types implementing the encoding.TextUnmarshaler interface

Pointers

  • pointers to supported types are also supported

Defining decoders for custom structs

For fields with custom struct types, you may implement the Decoder interface by specifying a Decode method to your type:

type customType struct {
	Value string
}

func (t *customType) Decode(value any) error {
	if stringValue, ok := value.(string); !ok {
		return errors.New("value is not a string")
	} else {
		t.Value = stringValue

		return nil
	}
}

Articles
to learn more about the golang concepts.

Resources
which are currently available to browse on.

mail [email protected] to add your project or resources here ๐Ÿ”ฅ.

FAQ's
to know more about the topic.

mail [email protected] to add your project or resources here ๐Ÿ”ฅ.

Queries
or most google FAQ's about GoLang.

mail [email protected] to add more queries here ๐Ÿ”.

More Sites
to check out once you're finished browsing here.

0x3d
https://www.0x3d.site/
0x3d is designed for aggregating information.
NodeJS
https://nodejs.0x3d.site/
NodeJS Online Directory
Cross Platform
https://cross-platform.0x3d.site/
Cross Platform Online Directory
Open Source
https://open-source.0x3d.site/
Open Source Online Directory
Analytics
https://analytics.0x3d.site/
Analytics Online Directory
JavaScript
https://javascript.0x3d.site/
JavaScript Online Directory
GoLang
https://golang.0x3d.site/
GoLang Online Directory
Python
https://python.0x3d.site/
Python Online Directory
Swift
https://swift.0x3d.site/
Swift Online Directory
Rust
https://rust.0x3d.site/
Rust Online Directory
Scala
https://scala.0x3d.site/
Scala Online Directory
Ruby
https://ruby.0x3d.site/
Ruby Online Directory
Clojure
https://clojure.0x3d.site/
Clojure Online Directory
Elixir
https://elixir.0x3d.site/
Elixir Online Directory
Elm
https://elm.0x3d.site/
Elm Online Directory
Lua
https://lua.0x3d.site/
Lua Online Directory
C Programming
https://c-programming.0x3d.site/
C Programming Online Directory
C++ Programming
https://cpp-programming.0x3d.site/
C++ Programming Online Directory
R Programming
https://r-programming.0x3d.site/
R Programming Online Directory
Perl
https://perl.0x3d.site/
Perl Online Directory
Java
https://java.0x3d.site/
Java Online Directory
Kotlin
https://kotlin.0x3d.site/
Kotlin Online Directory
PHP
https://php.0x3d.site/
PHP Online Directory
React JS
https://react.0x3d.site/
React JS Online Directory
Angular
https://angular.0x3d.site/
Angular JS Online Directory