diff --git a/go.mod b/go.mod index 30bd434..4a79387 100644 --- a/go.mod +++ b/go.mod @@ -37,6 +37,7 @@ require ( github.com/quic-go/qpack v0.5.1 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect + github.com/titanous/json5 v1.0.0 github.com/u2takey/go-utils v0.3.1 // indirect github.com/unki2aut/go-mpd v0.0.0-20250218132413-c6a2d2d492f4 go.uber.org/mock v0.5.0 // indirect diff --git a/go.sum b/go.sum index f75457b..f392d04 100644 --- a/go.sum +++ b/go.sum @@ -93,6 +93,8 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/titanous/json5 v1.0.0 h1:hJf8Su1d9NuI/ffpxgxQfxh/UiBFZX7bMPid0rIL/7s= +github.com/titanous/json5 v1.0.0/go.mod h1:7JH1M8/LHKc6cyP5o5g3CSaRj+mBrIimTxzpvmckH8c= github.com/u2takey/ffmpeg-go v0.5.0 h1:r7d86XuL7uLWJ5mzSeQ03uvjfIhiJYvsRAJFCW4uklU= github.com/u2takey/ffmpeg-go v0.5.0/go.mod h1:ruZWkvC1FEiUNjmROowOAps3ZcWxEiOpFoHCvk97kGc= github.com/u2takey/go-utils v0.3.1 h1:TaQTgmEZZeDHQFYfd+AdUT1cT4QJgJn/XVPELhHw4ys= diff --git a/util/traverse.go b/util/traverse.go new file mode 100644 index 0000000..c97d1fa --- /dev/null +++ b/util/traverse.go @@ -0,0 +1,49 @@ +package util + +func TraverseJSON( + data interface{}, + keys interface{}, +) interface{} { + var keySlice []string + switch k := keys.(type) { + case string: + keySlice = []string{k} + case []string: + keySlice = k + default: + return nil // unsupported keys type + } + + return traverseObject(data, keySlice) +} + +func traverseObject(data interface{}, keys []string) interface{} { + if len(keys) == 0 { + return data + } + + key := keys[0] + remainingKeys := keys[1:] + + switch d := data.(type) { + case map[string]interface{}: + if value, exists := d[key]; exists { + return traverseObject(value, remainingKeys) + } + + for _, value := range d { + result := traverseObject(value, keys) + if result != nil { + return result + } + } + case []interface{}: + for _, item := range d { + result := traverseObject(item, keys) + if result != nil { + return result + } + } + } + return nil +}