modify empty table decode

This commit is contained in:
Mike Farah 2025-09-04 14:23:06 +10:00 committed by Louis Lombard
parent c34edcf983
commit b1d6a88eb8
4 changed files with 49 additions and 16 deletions

View File

@ -294,7 +294,7 @@ Using [winget](https://learn.microsoft.com/en-us/windows/package-manager/)
winget install --id MikeFarah.yq winget install --id MikeFarah.yq
``` ```
### Mac: ### MacPorts:
Using [MacPorts](https://www.macports.org/) Using [MacPorts](https://www.macports.org/)
``` ```
sudo port selfupdate sudo port selfupdate
@ -324,6 +324,14 @@ Flox can be used to install yq on Linux, MacOS, and Windows through WSL.
flox install yq flox install yq
``` ```
### MacOS / Linux via gah:
Using [gah](https://github.com/marverix/gah)
```
gah install yq
```
## Features ## Features
- [Detailed documentation with many examples](https://mikefarah.gitbook.io/yq/) - [Detailed documentation with many examples](https://mikefarah.gitbook.io/yq/)
- Written in portable go, so you can download a lovely dependency free binary - Written in portable go, so you can download a lovely dependency free binary

View File

@ -41,7 +41,6 @@ func processFormatScenario(s formatScenario, decoder Decoder, encoder Encoder) (
} }
exp, err := getExpressionParser().ParseExpression(expression) exp, err := getExpressionParser().ParseExpression(expression)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -65,12 +64,10 @@ func processFormatScenario(s formatScenario, decoder Decoder, encoder Encoder) (
} }
func mustProcessFormatScenario(s formatScenario, decoder Decoder, encoder Encoder) string { func mustProcessFormatScenario(s formatScenario, decoder Decoder, encoder Encoder) string {
result, err := processFormatScenario(s, decoder, encoder) result, err := processFormatScenario(s, decoder, encoder)
if err != nil { if err != nil {
log.Error("Bad scenario %v: %w", s.description, err) log.Error("Bad scenario %v: %w", s.description, err)
return fmt.Sprintf("Bad scenario %v: %v", s.description, err.Error()) return fmt.Sprintf("Bad scenario %v: %v", s.description, err.Error())
} }
return result return result
} }

View File

@ -140,7 +140,6 @@ func (dec *tomlDecoder) createArray(tomlNode *toml.Node) (*CandidateNode, error)
Tag: "!!seq", Tag: "!!seq",
Content: content, Content: content,
}, nil }, nil
} }
func (dec *tomlDecoder) createStringScalar(tomlNode *toml.Node) (*CandidateNode, error) { func (dec *tomlDecoder) createStringScalar(tomlNode *toml.Node) (*CandidateNode, error) {
@ -190,7 +189,6 @@ func (dec *tomlDecoder) decodeNode(tomlNode *toml.Node) (*CandidateNode, error)
default: default:
return nil, fmt.Errorf("unsupported type %v", tomlNode.Kind) return nil, fmt.Errorf("unsupported type %v", tomlNode.Kind)
} }
} }
func (dec *tomlDecoder) Decode() (*CandidateNode, error) { func (dec *tomlDecoder) Decode() (*CandidateNode, error) {
@ -211,7 +209,7 @@ func (dec *tomlDecoder) Decode() (*CandidateNode, error) {
}() }()
log.Debug("ok here we go") log.Debug("ok here we go")
var runAgainstCurrentExp = false runAgainstCurrentExp := false
var err error var err error
for runAgainstCurrentExp || dec.parser.NextExpression() { for runAgainstCurrentExp || dec.parser.NextExpression() {
@ -242,7 +240,6 @@ func (dec *tomlDecoder) Decode() (*CandidateNode, error) {
} }
return dec.rootMap, deferredError return dec.rootMap, deferredError
} }
func (dec *tomlDecoder) processTopLevelNode(currentNode *toml.Node) (bool, error) { func (dec *tomlDecoder) processTopLevelNode(currentNode *toml.Node) (bool, error) {
@ -282,15 +279,15 @@ func (dec *tomlDecoder) processTable(currentNode *toml.Node) (bool, error) {
tableValue = dec.parser.Expression() tableValue = dec.parser.Expression()
// next expression is not table data, so we are done // next expression is not table data, so we are done
if tableValue.Kind != toml.KeyValue { if tableValue.Kind != toml.KeyValue {
log.Debug("got an empty table, returning") log.Debug("got an empty table")
return true, nil runAgainstCurrentExp = true
} } else {
runAgainstCurrentExp, err = dec.decodeKeyValuesIntoMap(tableNodeValue, tableValue) runAgainstCurrentExp, err = dec.decodeKeyValuesIntoMap(tableNodeValue, tableValue)
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
return false, err return false, err
} }
} }
}
c := Context{} c := Context{}
c = c.SingleChildContext(dec.rootMap) c = c.SingleChildContext(dec.rootMap)

View File

@ -23,6 +23,7 @@ street = "first street"
[owner] [owner]
name = "Tom Preston-Werner" name = "Tom Preston-Werner"
` `
var expectedTableArrayBeforeOwners = `owner: var expectedTableArrayBeforeOwners = `owner:
addresses: addresses:
- street: first street - street: first street
@ -67,6 +68,29 @@ var emptyTable = `
var emptyTableExpected = "dependencies: {}\n" var emptyTableExpected = "dependencies: {}\n"
var multipleEmptyTables = `
[firstEmptyTable]
[firstTableWithContent]
key = "value"
[secondEmptyTable]
[thirdEmptyTable]
[secondTableWithContent]
key = "value"
[fourthEmptyTable]
[fifthEmptyTable]
`
var expectedMultipleEmptyTables = `firstEmptyTable: {}
firstTableWithContent:
key: value
secondEmptyTable: {}
thirdEmptyTable: {}
secondTableWithContent:
key: value
fourthEmptyTable: {}
fifthEmptyTable: {}
`
var sampleWithHeader = ` var sampleWithHeader = `
[servers] [servers]
@ -238,6 +262,13 @@ var tomlScenarios = []formatScenario{
expected: expectedSampleWithHeader, expected: expectedSampleWithHeader,
scenarioType: "decode", scenarioType: "decode",
}, },
{
description: "Parse: multiple empty tables",
skipDoc: true,
input: multipleEmptyTables,
expected: expectedMultipleEmptyTables,
scenarioType: "decode",
},
} }
func testTomlScenario(t *testing.T, s formatScenario) { func testTomlScenario(t *testing.T, s formatScenario) {