A complete INI file parser for MoonBit with support for sections, multiple data types, comments, and comprehensive error handling
test "parse and query INI file" {
let ini_content =
#|[server]
#|host = localhost
#|port = 8080
#|debug = true
#|
let ini = try! @maria/ini_parser.parse(ini_content)
// Query values with type-safe getters
inspect(ini.get_string("server", "host"), content="Some(\"localhost\")")
inspect(ini.get_int("server", "port"), content="Some(8080)")
inspect(ini.get_bool("server", "debug"), content="Some(true)")
}test "create new INI file" {
let ini = @maria/ini_parser.IniFile::new()
inspect(ini.sections(), content="[]")
}test "parse INI with multiple sections" {
let content =
#|[app]
#|name = MyApp
#|version = 1.0
#|
#|[database]
#|host = localhost
#|port = 5432
#|
let ini = try! @maria/ini_parser.parse(content)
inspect(ini.sections().length(), content="2")
inspect(ini.has_section("app"), content="true")
inspect(ini.has_section("database"), content="true")
}test "type-safe value getters" {
let content =
#|[config]
#|name = test
#|count = 42
#|ratio = 3.14
#|enabled = true
#|
let ini = try! @maria/ini_parser.parse(content)
// Each getter returns Option[T]
inspect(ini.get_string("config", "name"), content="Some(\"test\")")
inspect(ini.get_int("config", "count"), content="Some(42)")
inspect(ini.get_double("config", "ratio"), content="Some(3.14)")
inspect(ini.get_bool("config", "enabled"), content="Some(true)")
// Non-existent keys return None
inspect(ini.get_string("config", "missing"), content="None")
}test "set values in INI file" {
let ini = @maria/ini_parser.IniFile::new()
// Set values using the IniValue enum
ini.set("app", "name", @maria/ini_parser.String("MyApp"))
ini.set("app", "port", @maria/ini_parser.Int(3000))
ini.set("app", "enabled", @maria/ini_parser.Bool(true))
ini.set("app", "timeout", @maria/ini_parser.Double(30.5))
inspect(ini.get_string("app", "name"), content="Some(\"MyApp\")")
inspect(ini.get_int("app", "port"), content="Some(3000)")
inspect(ini.get_bool("app", "enabled"), content="Some(true)")
inspect(ini.get_double("app", "timeout"), content="Some(30.5)")
}test "serialize INI to string" {
let ini = @maria/ini_parser.IniFile::new()
ini.set("section", "key", @maria/ini_parser.String("value"))
let output = ini.to_string()
inspect(output.contains("[section]"), content="true")
inspect(output.contains("key = value"), content="true")
}test "parse with comments" {
let content =
#|; This is a comment
#|[config]
#|# Another comment
#|key = value
#|
let ini = try! @maria/ini_parser.parse(content)
inspect(ini.get_string("config", "key"), content="Some(\"value\")")
}test "boolean parsing variations" {
let content =
#|[flags]
#|a = true
#|b = yes
#|c = on
#|d = 1
#|e = false
#|f = no
#|g = off
#|h = 0
#|
let ini = try! @maria/ini_parser.parse(content)
// All true variants
inspect(ini.get_bool("flags", "a"), content="Some(true)")
inspect(ini.get_bool("flags", "b"), content="Some(true)")
inspect(ini.get_bool("flags", "c"), content="Some(true)")
inspect(ini.get_bool("flags", "d"), content="Some(true)")
// All false variants
inspect(ini.get_bool("flags", "e"), content="Some(false)")
inspect(ini.get_bool("flags", "f"), content="Some(false)")
inspect(ini.get_bool("flags", "g"), content="Some(false)")
inspect(ini.get_bool("flags", "h"), content="Some(false)")
}test "quoted string values" {
let content =
#|[strings]
#|quoted = "hello world"
#|single = 'with spaces'
#|
let ini = try! @maria/ini_parser.parse(content)
inspect(ini.get_string("strings", "quoted"), content="Some(\"hello world\")")
inspect(ini.get_string("strings", "single"), content="Some(\"with spaces\")")
}test "error on invalid section" {
let invalid = "[section"
let result = try? @maria/ini_parser.parse(invalid)
inspect(result is Err(_), content="true")
}test "error on empty key" {
let invalid = "[section]\n= value"
let result = try? @maria/ini_parser.parse(invalid)
inspect(result is Err(_), content="true")
}test "inspect sections and keys" {
let content =
#|[section1]
#|a = 1
#|b = 2
#|[section2]
#|c = 3
#|
let ini = try! @maria/ini_parser.parse(content)
let sections = ini.sections()
inspect(sections.length(), content="2")
inspect(sections.contains("section1"), content="true")
let keys = ini.keys("section1")
inspect(keys.length(), content="2")
inspect(keys.contains("a"), content="true")
inspect(keys.contains("b"), content="true")
}moon run cmd/mainpub(all) suberror ParseError {
InvalidSection(Int, String)
InvalidKeyValue(Int, String)
EmptyKey(Int)
}impl Eq for ParseErrorimpl Show for ParseErrorpub(all) enum IniValue {
String(String)
Int(Int)
Double(Double)
Bool(Bool)
}Install
Download zipA complete INI file parser for MoonBit with support for sections, multiple data types, comments, and comprehensive error handling