Skip to content

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 strings 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 valueV 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.