Skip to content

TOML encoder: prefer readable table sections over inline tables#2649

Draft
Copilot wants to merge 2 commits intomasterfrom
copilot/featurereadable-toml-output
Draft

TOML encoder: prefer readable table sections over inline tables#2649
Copilot wants to merge 2 commits intomasterfrom
copilot/featurereadable-toml-output

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 6, 2026

When encoding to TOML from YAML/JSON, nested mappings were collapsed into compact inline table syntax (key = { ... }) instead of idiomatic TOML table sections ([key]). This affected both direct YAML→TOML conversion and round-trips through YAML.

Changes

Encoder (encoder_toml.go)

  • encodeTopLevelEntry: Replace EncodeSeparate check with FlowStyle check — only nodes explicitly marked as flow/inline stay inline; all block mappings become table sections
  • encodeSeparateMapping: Count FlowStyle mapping children as hasAttrs (they render as key = { ... }); replace writeTableHeader + encodeMappingBodyWithPath with recursive encodeSeparateMapping in the "no attrs" loop
  • encodeMappingBodyWithPath: Emit non-flow child mappings as sub-table sections ([parent.child]) instead of inline tables

Decoder (decoder_toml.go)

  • Set Style: FlowStyle on decoded inline TOML tables, distinguishing them from block mappings so they survive re-encoding as inline

Tests (toml_test.go)

  • Add encode scenario type (YAML→TOML) and coverage for table section output
  • Update roundtrip expectations: inline TOML tables now expand to table sections (more readable)

Before / After

# input YAML
arg:
  hello: foo
# before
arg = { hello = "foo" }

# after
[arg]
hello = "foo"

YAML flow mappings (arg: {hello: foo}) are preserved as TOML inline tables, respecting the author's explicit style intent.

When converting from YAML/JSON to TOML, the encoder now always uses
readable TOML table section syntax ([section]) instead of compact inline
hash table syntax (key = { ... }), which better matches TOML's goal as
a human-focused configuration format.

Changes:
- decoder_toml.go: Mark inline TOML tables with FlowStyle so round-trips
  can be distinguished from YAML flow mappings
- encoder_toml.go:
  - encodeTopLevelEntry: use FlowStyle check instead of EncodeSeparate to
    decide inline vs table section (all block mappings now become tables)
  - encodeSeparateMapping: count FlowStyle children as attributes; use
    recursive encodeSeparateMapping for nested non-flow mappings
  - encodeMappingBodyWithPath: emit non-flow child mappings as sub-table
    sections instead of inline tables
- toml_test.go: add encode (YAML→TOML) test scenarios, update roundtrip
  expectations for inline tables (now expanded to table sections)

Agent-Logs-Url: https://github.com/mikefarah/yq/sessions/4824a219-6d5e-42e7-bca1-a8a277bf8c6a

Co-authored-by: mikefarah <1151925+mikefarah@users.noreply.github.com>
Copilot AI changed the title [WIP] Add support for readable TOML output in yq TOML encoder: prefer readable table sections over inline tables Apr 6, 2026
Copilot AI requested a review from mikefarah April 6, 2026 10:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

yq TOML output prioritizes compact hash table syntax over readability

2 participants