Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

A lightweight, human-friendly configuration format for Go with simple syntax for fields, lists, and maps.

License

Notifications You must be signed in to change notification settings

kaval-lang/kaval

Repository files navigation

Kaval 🌱

Go Reference License: 0BSD

Kaval is a lightweight, human-friendly configuration language for Go applications. It provides a simple syntax for expressing structured data with fields, lists, and key-value pairs.

Kaval, version=1.0.0, ^enabled, !deprecated, features=simple;human-readable;flexible, 
settings=theme:dark;indent:4;display:compact

✨ Features

  • πŸ”€ Clean, minimal syntax
    No curly braces, no complex nesting. Friendly to read and write by humans
  • πŸ“ Compact
    Minimal syntax overhead, no deep nesting to navigate
  • πŸ”„ Convenient boolean toggles
    Use ^feature to enable, !feature to disable
  • πŸ“‹ Lists and maps
    Simple syntax for collections: tags=red;green;blue font=family:Arial;size:12
  • ⚑ Event-based parser
    Efficient parsing and serialization with a streaming parser API
  • πŸ”¨ Fluent builder API
    Programmatically create kaval strings
  • 🧩 Zero dependencies
    Just pure Go standard library, no reflect used

πŸ“¦ Installation

go get -u github.com/0x5a17ed/kaval

πŸš€ Quick Start

πŸ” Parsing Kaval

package main
import (
	"fmt"
	
	"github.com/0x5a17ed/kaval"
)
func main() {
	input := "^enabled, name=john, settings=theme:dark;fontSize:14"
	for event := range kaval.Parse(input) {
		switch e := event.(type) {
		case kaval.ListStartEvent:
			fmt.Printf(" ListStart:\n")
		case kaval.ListEndEvent:
			fmt.Printf(" ListEnd:\n")
		case kaval.MapStartEvent:
			fmt.Printf(" MapStart:\n")
		case kaval.MapEndEvent:
			fmt.Printf(" MapEnd:\n")
		case kaval.ValueEvent:
			fmt.Printf(" Value: %s\n", e.Value)
		case kaval.MapKeyEvent:
			fmt.Printf(" Key: %s\n", e.Value)
		}
	}
}
// Output:
// MapStart:
// Key: enabled (identifier)
// Value: true (boolean)
// Key: name (identifier)
// Value: john (identifier)
// Key: settings (identifier)
// MapStart:
// Key: theme (identifier)
// Value: dark (identifier)
// Key: fontSize (identifier)
// Value: 14 (number)
// MapEnd:
// MapEnd:

✏️ Creating Kaval

package main
import (
	"fmt"
	"github.com/0x5a17ed/kaval"
)
func main() {
	builder := kaval.NewBuilder()
	result := builder.
		Enable("feature").
		Labeled("name", "john").
		LabeledList("tags", "dev", "prod").
		LabeledDict("settings", "theme", "dark", "fontSize", 14).
		String()
	fmt.Println(result)
}
// Output: ^feature,name=john,tags=dev;prod,settings=theme:dark;fontSize:14

πŸ“ Syntax

Kaval uses a simple, flat structure:

  • Fields are comma-separated: name=john, age=30
  • Boolean toggles use prefixes: ^enabled, !disabled
  • Lists use semicolons: tags=red;green;blue
  • Maps (key-value pairs) use colon and semicolon: settings=theme:dark;fontSize:14
  • Blank spaces are allowed around syntax elements

πŸ§ͺ Data Types

  • Strings: name=john or message="Hello, world!" (quotes for special chars)
  • Numbers: age=30, pi=3.14, hex=0xFF, binary=0b1010
  • Booleans: active=true or valid=false
  • Lists: colors=red;green;blue
  • Maps: settings=theme:dark;fontSize:14
  • Null: value=nil

πŸ“š Detailed Usage

πŸ› οΈ Builder with Options

package main
import (
	"fmt"
	"github.com/0x5a17ed/kaval"
)
func main() {
	options := kaval.BuilderOptions{
		SpaceAfterFieldSeparator: true,
		SpaceAfterListSeparator: true,
		SpaceAfterPairsSeparator: true,
		SpaceAroundFieldAssignment: true,
	}
	builder := kaval.NewBuilder(options)
	result := builder.
		Enable("feature").
		Labeled("name", "john").
		LabeledList("tags", "dev", "prod").
		LabeledDict("settings", "theme", "dark", "fontSize", 14).
		String()
	fmt.Println(result)
}
// Output: ^feature, name = john, tags = dev; prod, settings = theme: dark; fontSize: 14

πŸ“œ License

This project is licensed under the 0BSD Licence β€” see the LICENCE file for details.


Made with ❀️ for structured data 🌟

About

A lightweight, human-friendly configuration format for Go with simple syntax for fields, lists, and maps.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /