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
- π€ 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, noreflect
used
go get -u github.com/0x5a17ed/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:
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
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
- Strings:
name=john
ormessage="Hello, world!"
(quotes for special chars) - Numbers:
age=30
,pi=3.14
,hex=0xFF
,binary=0b1010
- Booleans:
active=true
orvalid=false
- Lists:
colors=red;green;blue
- Maps:
settings=theme:dark;fontSize:14
- Null:
value=nil
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
This project is licensed under the 0BSD Licence β see the LICENCE file for details.
Made with β€οΈ for structured data π