toml #
Description
toml
is a fully fledged TOML v1.0.0 compatible parser written in pure V. The module is tested against the official compliance tests.
Usage
Parsing files or string
s containing TOML is easy.
Simply import the toml
module and do:
doc1 := toml.parse_text(<string content>) or { panic(err) }
doc2 := toml.parse_file(<file path>) or { panic(err) }
Example
Here we parse the official TOML example and print out some values.
import toml
const toml_text = '# This is a TOML document.
title = "TOML Example"
[owner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00 # First class dates
[database]
server = "192.168.1.1"
ports = [ 8000, 8001, 8002 ]
connection_max = 5000
enabled = true
[servers]
# Indentation (tabs and/or spaces) is allowed but not required
[servers.alpha]
ip = "10.0.0.1"
dc = "eqdc10"
[servers.beta]
ip = "10.0.0.2"
dc = "eqdc10"
[clients]
data = [ ["gamma", "delta"], [1, 2] ]
# Line breaks are OK when inside arrays
hosts = [
"alpha",
"omega"
]'
fn main() {
doc := toml.parse_text(toml_text) or { panic(err) }
title := doc.value('title').string()
println('title: "${title}"')
ip := doc.value('servers.alpha.ip').string()
println('Server IP: "${ip}"')
}
Value retrieval
The toml
module supports easy retrieval of values from TOML documents by using a small and simple query syntax as argument to the value()
function.
Keys in map entries are denoted by .
and array entries uses [<int>]
. Quoted keys are also supported by using the delimiters "
or '
.
doc.value('table.array[0].a."b.c"')
To query for a value that might not be in the document you can use the .default_to(...)
function to provide a default value.
For cases where a default value might not be appropriate or to check if a value exists you can use doc.value_opt('query')!
instead.
import toml
const toml_text = '
val = true
[table]
array = [
{ a = "A" },
{ b = "B" }
]
'
doc := toml.parse_text(toml_text) or { panic(err) }
assert doc.value('val').bool() == true
assert doc.value('table.array[0].a').string() == 'A'
// Provides a default value
assert doc.value('non.existing').default_to(false).bool() == false
// Check if value exist
// doc.value_opt('should.exist') or { ... }
// or
if value := doc.value_opt('table.array[1].b') {
assert value.string() == 'B'
}
// You can pass parts of the TOML document around
// and still use .value()/.value_opt() to get the values
arr := doc.value('table.array')
assert arr.value('[1].b').string() == 'B'
Conversion
Any TOML value can be converted to a V equivalent type.
TOML values are represented as the toml.Any
sum-type that can be converted to a V type.
TOML value | V conversion (via toml.Any ) |
---|---|
val = "Basic string" | .string() |
val = 'Literal string' | .string() |
val = true | .bool() |
val = 1979-05-27T07:32:00Z | .datetime() (toml.DateTime) |
val = 1979-05-27 | .date() (toml.Date) |
val = 07:32:59 | .time() (toml.Time) |
val = 3.14 | .f32() / .f64() |
val = 100 | .int() / .i64() / .u64() |
Read more about values in the TOML specification.
TOML to JSON
The toml.to
module supports easy serialization of any TOML to JSON.
import toml
import toml.to
const toml_text = '
val = true
[table]
array = [
{ a = "A" },
{ b = "B" }
]
'
doc := toml.parse_text(toml_text) or { panic(err) }
assert to.json(doc) == '{ "val": true, "table": { "array": [ { "a": "A" }, { "b": "B" } ] } }'
Constants #
const null = Any(Null{})
fn ast_to_any #
fn ast_to_any(value ast.Value) Any
ast_to_any converts from
ast.Value to toml.Any value.
fn decode #
fn decode[T](toml_txt string) !T
decode decodes a TOML string
into the target type T
. If T
has a custom .from_toml()
method, it will be used instead of the default.
fn encode #
fn encode[T](typ T) string
encode encodes the type T
into a TOML string. If T
has a custom .to_toml()
method, it will be used instead of the default.
fn parse_dotted_key #
fn parse_dotted_key(key string) ![]string
parse_dotted_key converts key
string to an array of strings. parse_dotted_key preserves strings delimited by both "
and '
.
fn parse_file #
fn parse_file(path string) !Doc
parse_file parses the TOML file in path
.
fn parse_text #
fn parse_text(text string) !Doc
parse_text parses the TOML document provided in text
.
type Any #
type Any = Date
| DateTime
| Null
| Time
| []Any
| bool
| f32
| f64
| i64
| int
| map[string]Any
| string
| u64
Pretty much all the same builtin types as the json2.Any
type plus DateTime
,Date
,Time
fn (Any) string #
fn (a Any) string() string
string returns Any
as a string.
fn (Any) to_toml #
fn (a Any) to_toml() string
to_toml returns Any
as a TOML encoded value.
fn (Any) int #
fn (a Any) int() int
int returns Any
as an 32-bit integer.
fn (Any) i64 #
fn (a Any) i64() i64
i64 returns Any
as a 64-bit integer.
fn (Any) u64 #
fn (a Any) u64() u64
u64 returns Any
as a 64-bit unsigned integer.
fn (Any) f32 #
fn (a Any) f32() f32
f32 returns Any
as a 32-bit float.
fn (Any) f64 #
fn (a Any) f64() f64
f64 returns Any
as a 64-bit float.
fn (Any) array #
fn (a Any) array() []Any
array returns Any
as an array.
fn (Any) as_map #
fn (a Any) as_map() map[string]Any
as_map returns Any
as a map (TOML table).
fn (Any) bool #
fn (a Any) bool() bool
bool returns Any
as a boolean.
fn (Any) date #
fn (a Any) date() Date
date returns Any
as a toml.Date
struct.
fn (Any) time #
fn (a Any) time() Time
time returns Any
as a toml.Time
struct.
fn (Any) datetime #
fn (a Any) datetime() DateTime
datetime returns Any
as a toml.DateTime
struct.
fn (Any) default_to #
fn (a Any) default_to(value Any) Any
default_to returns value
if a Any
is Null
. This can be used to set default values when retrieving values. E.g.: toml_doc.value('wrong.key').default_to(123).int()
fn (Any) value #
fn (a Any) value(key string) Any
value queries a value from the Any
type. key
supports a small query syntax scheme: Maps can be queried in "dotted" form e.g. a.b.c
. quoted keys are supported as a."b.c"
or a.'b.c'
. Arrays can be queried with a[0].b[1].[2]
.
fn (Any) value_opt #
fn (a Any) value_opt(key string) !Any
value_opt queries a value from the current element's tree. Returns an error if the key is not valid or there is no value for the key.
fn (Any) reflect #
fn (a Any) reflect[T]() T
reflect returns T
with T.<field>
's value set to the value of any 1st level TOML key by the same name.
fn ([]Any) value #
fn (a []Any) value(key string) Any
value queries a value from the array. key
supports a small query syntax scheme: The array can be queried with [0].b[1].[2]
. Maps can be queried in "dotted" form e.g. a.b.c
. quoted keys are supported as a."b.c"
or a.'b.c'
.
fn ([]Any) as_strings #
fn (a []Any) as_strings() []string
as_strings returns the contents of the array as []string
fn ([]Any) to_toml #
fn (a []Any) to_toml() string
to_toml returns the contents of the array as a TOML encoded string
.
fn (map[string]Any) value #
fn (m map[string]Any) value(key string) Any
value queries a value from the map. key
supports a small query syntax scheme: Maps can be queried in "dotted" form e.g. a.b.c
. quoted keys are supported as a."b.c"
or a.'b.c'
. Arrays can be queried with a[0].b[1].[2]
.
fn (map[string]Any) as_strings #
fn (m map[string]Any) as_strings() map[string]string
as_strings returns the contents of the map as map[string]string
fn (map[string]Any) to_toml #
fn (m map[string]Any) to_toml() string
to_toml returns the contents of the map as a TOML encoded string
.
fn (map[string]Any) to_inline_toml #
fn (m map[string]Any) to_inline_toml() string
to_inline_toml returns the contents of the map as an inline table encoded TOML string
.
struct Config #
struct Config {
pub:
text string // TOML text
file_path string // '/path/to/file.toml'
parse_comments bool
}
Config is used to configure the toml parser. Only one of the fields text
or file_path
, is allowed to be set at time of configuration.
struct Date #
struct Date {
pub:
date string
}
Date is the representation of an RFC 3339 date-only string.
fn (Date) str #
fn (d Date) str() string
str returns the RFC 3339 date-only string representation.
struct DateTime #
struct DateTime {
pub:
datetime string
}
DateTime is the representation of an RFC 3339 datetime string.
fn (DateTime) str #
fn (dt DateTime) str() string
str returns the RFC 3339 string representation of the datetime.
struct Doc #
struct Doc {
pub:
ast &ast.Root = unsafe { nil }
}
Doc is a representation of a TOML document. A document can be constructed from a string
buffer or from a file path
fn (Doc) decode #
fn (d Doc) decode[T]() !T
decode decodes a TOML string
into the target struct type T
.
fn (Doc) to_any #
fn (d Doc) to_any() Any
to_any converts the Doc
to toml.Any type.
fn (Doc) reflect #
fn (d Doc) reflect[T]() T
reflect returns T
with T.<field>
's value set to the value of any 1st level TOML key by the same name.
fn (Doc) value #
fn (d Doc) value(key string) Any
value queries a value from the TOML document. key
supports a small query syntax scheme: Maps can be queried in "dotted" form e.g. a.b.c
. quoted keys are supported as a."b.c"
or a.'b.c'
. Arrays can be queried with a[0].b[1].[2]
.
fn (Doc) value_opt #
fn (d Doc) value_opt(key string) !Any
value_opt queries a value from the TOML document. Returns an error if the key is not valid or there is no value for the key.
struct Null #
struct Null {
}
Null is used in sumtype checks as a "default" value when nothing else is possible.
struct Time #
struct Time {
pub:
time string
}
Time is the representation of an RFC 3339 time-only string.
fn (Time) str #
fn (t Time) str() string
str returns the RFC 3339 time-only string representation.