v0.4.0
After some time of inactivity this package is now maintained again.
This release should support alll of TOML 1.0 and has various bugfixes and a few small improvements.
This requires Go 1.13 or newer; older Go versions will no longer work.
TOML 1.0 support
Previously this library implemented TOML 0.3; now all of TOML 1.0 is supported:
-
Support dotted keys (
a.b = 1
,a = {b.c = 2}
). -
Mixed arrays: in previous TOML versions array values all had to be of the same type; you can now freely mix types, including inline tables.
-
Support hex (
0x2f9a
), binary (0b0110
), and octal (0o777
) literals, and supportnan
andinf
for floats. -
Support local datetimes, dates, and times. These are dates and times without a timezone and are parsed in the local timezone.
-
Allow accidental whitespace between backslash and newline in the line continuation operator in multi-line basic strings.
There should be no incompatibilities as such; all existing valid TOML files should continue to work. However, the parser previously allowed the following invalid values:
-
It would allow literal control characters in strings.
-
It would allow leading zeroes in decimal ints and floats.
Neither of these was ever valid TOML, and are explicitly forbidden by the specification. But the library erroneously permitted them.
Other changes
-
Set up Go modules.
-
Allow escaping the
\
, and allow triple-quotes strings to end with a quote (e.g.x="""x""""
). -
All control characters inside strings are properly escaped when encoding.
-
Support encoding nested anonymous structs.
-
Encode toml.Primitive values.
-
You get a more helpful error on UTF-16 files (probably the most common non-UTF-8 compatible encoding). Also read over UTF-16 BOM in UTF-8 files.
-
Call
MarshalText
andUnmarshalText
consistently on all types; before this didn't always happen in some cases. -
Allow empty quoted keys (
"" = 1
); silly, but explicitly mentioned as valid. -
Don't panic in encoder on unsupported types; return an error instead.
-
Don't panic on unclosed inline arrays.
-
Add
Decoder
and deprecateDecodeReader()
; this is more consistent with how other decoders tend to work and allows adding decoding options. -
Add
DecodeFS()
for Go 1.16 or newer. -
Avoid creating new functions/allocations in lexSkip; small performance improvement.