feat(encode): write the TOML 1.1 output form
Assisted-by: DeepSeek V4.1 Flash
This commit is contained in:
+30
-8
@@ -145,11 +145,12 @@ variants decode into `LocalDateTime`, `LocalDate` and `LocalTime`, whose
|
||||
embedded `time.Time` is normalised to UTC (midnight UTC for a local date, the
|
||||
zero date for a local time). Every kind may omit the seconds as of TOML 1.1
|
||||
(`07:32`, `1979-05-27T07:32`); such a value carries a zero second, and the
|
||||
canonical rendering writes full seconds. There is no implicit conversion
|
||||
between the offset and local kinds; assigning one to the other is an error.
|
||||
The four types take a bare timestamp and never a quoted string, so a document
|
||||
that writes a date-time with quotes does not decode into them, and neither
|
||||
`encoding.TextUnmarshaler` nor the embedded `time.Time` changes that.
|
||||
encoder writes the seconds only when the value carries them, so a document
|
||||
written without seconds comes back without them. There is no implicit
|
||||
conversion between the offset and local kinds; assigning one to the other is an
|
||||
error. The four types take a bare timestamp and never a quoted string, so a
|
||||
document that writes a date-time with quotes does not decode into them, and
|
||||
neither `encoding.TextUnmarshaler` nor the embedded `time.Time` changes that.
|
||||
|
||||
### Arrays of tables
|
||||
|
||||
@@ -426,6 +427,23 @@ carry verbatim (an embedded run of three single quotes, a control character
|
||||
other than tab or newline, or a carriage return outside a CRLF pair) also keeps
|
||||
the basic form, so the output always re-parses to the same value.
|
||||
|
||||
### Inline tables
|
||||
|
||||
A table element of a value array is written as one `{a = 1, b = 2}` line while
|
||||
it fits. An inline table that would pass the hundredth column carries newlines
|
||||
and a trailing comma instead, which TOML 1.1 allows:
|
||||
|
||||
```toml
|
||||
arr = [1, {
|
||||
n = 1,
|
||||
name = "a value long enough to push the line past the limit",
|
||||
}]
|
||||
```
|
||||
|
||||
The closing brace and the entries are indented one tab per nesting level, a
|
||||
nested table is measured on its own line, and the output re-parses to the same
|
||||
value either way.
|
||||
|
||||
### Cancellation
|
||||
|
||||
`MarshalContext` and `(*Encoder).MarshalContext` accept a `context.Context`. The
|
||||
@@ -440,6 +458,8 @@ The output is not byte-identical to any document that produced the value:
|
||||
- map keys are emitted in sorted order
|
||||
- the choice between `[table]` headers and inline tables is not preserved
|
||||
- strings use the basic quoted form unless the literal option above applies
|
||||
- a date-time drops its zero seconds and the trailing zeros of its fraction, so
|
||||
`07:32:00` is written `07:32`; both are the same value
|
||||
- floats always carry a `.` or an exponent, so a float `1` is emitted as `1.0`
|
||||
and stays distinguishable from the integer `1` across a round-trip; negative
|
||||
zero is normalised to `0.0`
|
||||
@@ -545,9 +565,11 @@ type LocalDate struct{ time.Time } // 1979-05-27
|
||||
type LocalTime struct{ time.Time } // 07:32:00.999999
|
||||
```
|
||||
|
||||
Each carries a `String()` method returning the TOML-canonical rendering, with
|
||||
the fractional second zero-padded to nanosecond precision when present. The
|
||||
types are produced by `Parse` and accepted by `Marshal`.
|
||||
Each carries a `String()` method returning the TOML-canonical rendering: the
|
||||
seconds appear only when the value carries them, and a fractional second drops
|
||||
its trailing zeros, so `07:32:00` renders as `07:32` and a half second as
|
||||
`00.5`. The types are produced by `Parse` and accepted by `Marshal`, which
|
||||
writes them through `String()`.
|
||||
|
||||
## Errors
|
||||
|
||||
|
||||
Reference in New Issue
Block a user