* unmarshal: support encoding.TextUnmarshaler
This PR adds support for decoding fields of primitive types that implement
encoding.TextUnmarshaler by calling the custom method.
Fields in anonymous structs are not supported at this point.
Co-authored-by: Lorenz Bauer <lmb@users.noreply.github.com>
With this PR the encoder now supports encoding.TextMarshaler.
Additionally, a bug is fixed, where the encoder does not notice a pointer
field that implements the toml.Marshaler interface.
fixes#373
This PR adds a strict mode to the Decoder. It can be enabled with the
`Strict` method.
In the strict mode, the decoder fails if any fields that were part
of the input do not have a corresponding field in the struct.
Fixes#277
Currently, the marshalling code encodes the embedded structs as sub-tables.
This is a bit unexpected, as it differs from what encoding/json does in
that case: https://play.golang.org/p/KDPaGtrijV1
Unmarshalling code handles this scenario gracefully.
This PR adapts the encoder to behave like encoding/json.
Fields in an embedded struct are promoted to the top level table.
In case the embedded struct is named in the tag, it will still
encode as a sub-table.
The added PromoteAnonymous option on the Encoder allows configuring
the old behavior, where anonymous structs are encoded as sub-tables.
On duplicate keys, the behavior of encoding/json is mimicked:
Fields from anonymous structs are shadowed by regular fields.
An example is added to show the affects of setting PromoteAnonymous.
* add test for unexported field preservation
* merge struct values instead of replacing them
* use struct merging on nested value structs
* unmarshalling merges nested struct pointers when non-nil
Previously, this would fail with:
```
panic: reflect.Value.SetMapIndex: value of type string is not assignable to type toml.letter [recovered]
panic: reflect.Value.SetMapIndex: value of type string is not assignable to type toml.letter
```
Now this only panics when the key type cannot be converted from a
string.