A super-simple, very fast data file format!
Go to file
2025-03-04 19:15:05 -06:00
bench ref 9 2025-03-04 18:23:09 -06:00
tests ref 8 2025-03-04 17:29:39 -06:00
.gitignore Initial commit 2025-02-16 21:09:54 -06:00
config.go ref 10 2025-03-04 19:15:05 -06:00
go.mod ref 1 2025-03-01 21:10:04 -06:00
go.sum ref 1 2025-03-01 21:10:04 -06:00
LICENSE Initial commit 2025-02-16 21:09:54 -06:00
pool.go ref 9 2025-03-04 18:23:09 -06:00
README.md ref 1 2025-03-01 21:10:04 -06:00
scanner.go ref 9 2025-03-04 18:23:09 -06:00
token.go ref 8 2025-03-04 17:29:39 -06:00

Go Config Parser

A lightweight, intuitive configuration parser for Go applications with a clean, readable syntax.`

Features

  • Simple, human-readable configuration format
  • Strong typing with automatic type conversion
  • Nested structures with dot notation access
  • Support for arrays and maps
  • Inline and block comments
  • Fast parsing with no dependencies
  • Full test coverage

Configuration Format

This parser uses a clean, minimal syntax that's easy to read and write:

host = "localhost"
port = 8080
debug = true

allowed_ips {
    "192.168.1.1"
    "192.168.1.2"
    "10.0.0.1"
}

database {
    host = "db.example.com"
    port = 5432
    credentials {
        username = "admin"
        password = "secure123"
    }
}

-- This is a line comment
--[[ This is a
     block comment spanning
     multiple lines ]]

Installation

go get git.sharkk.net/Go/Config

Usage

Basic Usage

package main

import (
    "fmt"
    "os"
    
    config "git.sharkk.net/Go/Config"
)

func main() {
    // Load configuration from file
    file, err := os.Open("config.conf")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    
    cfg, err := config.Load(file)
    if err != nil {
        panic(err)
    }
    
    // Access values with type conversion
    host, err := cfg.GetString("database.host")
    port, err := cfg.GetInt("database.port")
    debug, err := cfg.GetBool("debug")
    
    // Use default values for missing keys
    timeout := cfg.GetOr("timeout", 30).(int64)
}

Type Conversion

The parser automatically converts values to appropriate types:

// These will return properly typed values
boolValue, err := cfg.GetBool("feature.enabled")
intValue, err := cfg.GetInt("server.port")
floatValue, err := cfg.GetFloat("threshold")
stringValue, err := cfg.GetString("app.name")

// For complex types
arrayValue, err := cfg.GetArray("allowed_ips")
mapValue, err := cfg.GetMap("database")

// Generic getter (returns interface{})
value, err := cfg.Get("some.key")

Accessing Arrays and Maps

Access array elements and nested map values using dot notation:

// Access the first element in the array
firstIP, err := cfg.GetString("allowed_ips.0")

// Access deeply nested values
username, err := cfg.GetString("database.credentials.username")

Performance

This parser provides competitive performance compared to popular formats like JSON, YAML, and TOML:

Benchmark Operations Time (ns/op) Memory (B/op) Allocations (allocs/op)
Small Config Files
Config 718,893 1,611 5,256 25
JSON 1,000,000 1,170 1,384 23
YAML 213,438 5,668 8,888 82
TOML 273,586 4,505 4,520 67
Medium Config Files
Config 138,517 8,777 11,247 114
JSON 241,069 4,996 5,344 89
YAML 47,695 24,183 21,577 347
TOML 66,411 17,709 16,349 208
Large Config Files
Config 33,177 35,591 31,791 477
JSON 66,384 18,066 18,138 297
YAML 12,482 95,248 65,574 1,208
TOML 17,594 67,928 66,038 669

Benchmarked on AMD Ryzen 9 7950X 16-Core Processor

Why Choose This Parser?

  • Readability: Simple syntax that's easy for humans to read and write
  • Flexibility: Supports various data types and nested structures
  • Performance: Fast parsing with minimal overhead
  • Type Safety: Strong typing with automatic conversion
  • Simplicity: No external dependencies required

License

MIT