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
```
### Mac:
### MacPorts:
Using [MacPorts](https://www.macports.org/)
```
sudo port selfupdate
@ -324,6 +324,14 @@ Flox can be used to install yq on Linux, MacOS, and Windows through WSL.
flox install yq
```
### MacOS / Linux via gah:
Using [gah](https://github.com/marverix/gah)
```
gah install yq
```
## Features
- [Detailed documentation with many examples](https://mikefarah.gitbook.io/yq/)
- 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)
if err != nil {
return "", err
}
@ -65,12 +64,10 @@ func processFormatScenario(s formatScenario, decoder Decoder, encoder Encoder) (
}
func mustProcessFormatScenario(s formatScenario, decoder Decoder, encoder Encoder) string {
result, err := processFormatScenario(s, decoder, encoder)
if err != nil {
log.Error("Bad scenario %v: %w", s.description, err)
return fmt.Sprintf("Bad scenario %v: %v", s.description, err.Error())
}
return result
}

View File

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

View File

@ -23,6 +23,7 @@ street = "first street"
[owner]
name = "Tom Preston-Werner"
`
var expectedTableArrayBeforeOwners = `owner:
addresses:
- street: first street
@ -67,6 +68,29 @@ var emptyTable = `
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 = `
[servers]
@ -238,6 +262,13 @@ var tomlScenarios = []formatScenario{
expected: expectedSampleWithHeader,
scenarioType: "decode",
},
{
description: "Parse: multiple empty tables",
skipDoc: true,
input: multipleEmptyTables,
expected: expectedMultipleEmptyTables,
scenarioType: "decode",
},
}
func testTomlScenario(t *testing.T, s formatScenario) {