Skip to content

Tags: BurntSushi/toml

Tags

v1.4.0

Toggle v1.4.0's commit message
v1.4.0

This version requires Go 1.18

- Add toml.Marshal() (#405)

- Require 2-digit hour (#320)

- Wrap UnmarshalTOML() and UnmarshalText() return values in ParseError
  for position information (#398)

- Fix inline tables with dotted keys inside inline arrays
  (e.g. `k=[{a.b=1}]`) (#400)

v1.3.2

Toggle v1.3.2's commit message
v1.3.2

Fix reading `BURNTSUSHI_TOML_110` again 😅 The fix for 1.3.1 caused a
race issue with multiple decodes being run in parallel.

v1.3.1

Toggle v1.3.1's commit message
v1.3.1

This fixes two small bugs:

- The `BURNTSUSHI_TOML_110` environment variable would be checked on
  package import, rather than Decode().

  This meant that setting `os.Setenv("BURNTSUSHI_TOML_110", "")` had no
  effect, as it happens after the import.

- Fix order of `Meta.Keys()` for inline tables (this has been an issue
  since support for inline tables was added).

v1.3.0

Toggle v1.3.0's commit message
v1.3.0

New features:

- Support upcoming TOML 1.1

  While it looks like TOML 1.1 is mostly stable and I don't expect any further
  major changes, there are *NO* compatibility guarantees as it is *NOT* yet
  released and *anything can still change*.

  To use it, set the `BURNTSUSHI_TOML_110` environment variable to any value,
  which can be done either with `os.SetEnv()` or by the user running a program.

  A full list is changes is available in the [TOML ChangeLog]; the two most
  notable ones are that newlines and trailing commas are now allowed in inline
  tables, and Unicode in bare keys can now be used – this is now a valid
  document:

      lëttërs = {
        ä = "a with diaeresis",
        è = "e with accent grave",
      }

  [TOML ChangeLog]: https://github.com/toml-lang/toml/blob/main/CHANGELOG.md

- Allow MarshalTOML and MarshalText to be used on the document type itself,
  instead of only fields (#383).

Bufixes:

- `\` escapes at the end of line weren't processed correctly in multiline
  strings (#372).

- Skip UTF-8 BOM (#381).

- `omitempty` struct tag did not work for pointer values (#371).

- Fix encoding anonymous structs on 32bit systems (#374).

v1.2.1

Toggle v1.2.1's commit message
Release v1.2.1

This release fixes the `omitempty` struct tag on an uncomparable type
panicking.

v1.2.0

Toggle v1.2.0's commit message
Release v1.2.0

This release adds a few additional features:

- Support encoding and decoding json.Number, making interoperability
  with JSON when using json.Encoder.UseNumber() easier.

- Support time.Duration string format; an integer will be interpreted as
  nanoseconds (like before), but a string like "5h" will be parsed. On
  encoding the string format is used.

- The omitempty struct tag now also works for structs with all zero
  values, for example an empty time.Time. A struct is considered "empty"
  when *all* fields (exported *and* private) are the zero value.

- Allow using interface{} (or any) as the map key when decoding.

And some fixes:

- Fix encoding.TextUnmarshaler not working for map values.

- Make encoding.TextUnmarshaler and toml.Unmarshaler work if
  MarshalText() or MarshalTOML() have a pointer receiver.

- Error out on nil returns from MarshalTOML/MarshalText; before they
  would get encoded as invalid TOML (keyname =).

- Fix a panic where it would try to encode array = [{}, 0] as:

      [[array]]
      [[array]]

  Which isn't valid as 0 isn't a table.

- Some better error reporting for some errors.

v1.1.0

Toggle v1.1.0's commit message
Release v1.1.0

Just a few bugfixes:

- Skip fields with `toml:"-"` even when they're unsupported types.
  Previously something like this would fail to encode due to `func`
  being an unsupported type:

      struct {
          Str  string `toml:"str"
          Func func() `toml:"-"`
      }

- Multiline strings can't end with `\`. This is valid:

      # Valid
      key = """ foo \
      """

	  # Invalid
	  key = """ foo \ """

- Don't quote values in `TOMLMarshaler`. Previously they would always
  include quoting (e.g. `"value"`), while the entire point of this
  interface is to bypass that.

v1.0.0

Toggle v1.0.0's commit message
Tag release v1.0.0

This release adds much more detailed errors, support for the `toml.Marshaler`
interface, and several fixes.

There is no special meaning in the jump to v1.0; the 0.x releases were always
treated as if they're 1.x with regards to compatibility; the versioning scheme
for this library predates the release of modules.

New features
------------
- Error reporting is much improved; the reported position of errors should now
  always be correct and the library can print more detailed errors (#299, #332)

  Decode always return a `toml.ParseError`, which has three methods:

  - `Error()` behaves as before and shows a single concise line with the error.

  - `ErrorWithLocation()` shows the same error, but also shows the line the
    error occurred at, similar to e.g. clang or the Rust compiler.

  - `ErrorWithUsage()` is the same as `ErrorWithPosition()`, but may also show a
    longer usage guidance message. This isn't always present (in which case it
    behaves identical to `ErrorWithPosition()`), but it should be present for
    most common mistakes and sources of confusion.

  Which error the correct one to use is depends on your application and
  preferences; in general I would recommend using at least `ErrorWithPosition()`
  for user-facing errors, as it's much more helpful for users of any skill
  level. If your users are likely to be non-technical then `ErrorWithUsage()` is
  probably a good idea; I did my best to avoid technical jargon such as
  "newline" and phrase things in a way that's understandable by most people not
  intimately familiar with these sort of things.

  Additionally, the TOML key that fialed should now always be reported in all
  errors.

- Add `toml.Marshaler` interface. This can be used if you want full control over
  how something is marshalled as TOML, similar to `json.Marshaler` etc. This
  takes precedence over `encoding.TextMarshaler`. (#327)

- Allow TOML integers to be decoded to a Go float (#325)

  Previously `int = 42` could only be decoded to an `int*` type; now this can
  also be decoded in a `float` type as long as it can be represented without
  loss of data.

Fixes
-----
- Key.String() is now quoted when needed (#333)

- Fix decoding of nested structs on 32bit platforms (#314)

- Empty slices are now always `[]T{}` rather than nil, which was the behaviour
  in v0.3.1 and before. While they are identical for most purposes,
  encoding/json encodes them different (`[]` vs. `null`), making it an
  (accidentally) incompatible change (#339)

v0.4.1

Toggle v0.4.1's commit message
Release v0.4.1

This fixes a cyclic module dependency issue with
github.com/BurntSushi/toml-test that prevented some people from
updating. See #313 for some details.

v0.4.0

Toggle v0.4.0's commit message
Tag release 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 support `nan` and `inf` 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` and `UnmarshalText` 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 deprecate `DecodeReader()`; 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.