Skip to content

Commit

Permalink
refactor(httpjson): Refactor stream parser
Browse files Browse the repository at this point in the history
Signed-off-by: Vincent Boutour <bob@vibioh.fr>
  • Loading branch information
ViBiOh committed Mar 29, 2024
1 parent 47ea72c commit c90450a
Showing 1 changed file with 32 additions and 21 deletions.
53 changes: 32 additions & 21 deletions pkg/httpjson/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,16 +95,18 @@ func Stream[T any](stream io.Reader, output chan<- T, key string, closeChan bool
decoder := json.NewDecoder(stream)

if len(key) > 0 {
if err := moveDecoderToKey(decoder, key); err != nil {
return err
if err := moveToKey(decoder, key); err != nil {
return fmt.Errorf("move to key: %w", err)
}
}

var obj T

for decoder.More() {
if err := decoder.Decode(&obj); err != nil {
return fmt.Errorf("decode stream: %w", err)
}

output <- obj
}

Expand All @@ -117,33 +119,42 @@ func Stream[T any](stream io.Reader, output chan<- T, key string, closeChan bool
return nil
}

func moveDecoderToKey(decoder *json.Decoder, key string) error {
var token json.Token
func moveToKey(decoder *json.Decoder, key string) error {
if key != "." {
if err := findStart(decoder, key); err != nil {
return fmt.Errorf("find start: %w", err)
}
}

if _, err := decoder.Token(); err != nil {
return fmt.Errorf("read opening token: %w", err)
}

return nil
}

func findStart(decoder *json.Decoder, key string) error {
var nested uint64
var err error

if key != "." {
for {
token, err = decoder.Token()
if err != nil {
return fmt.Errorf("decode token: %w", err)
}
for {
token, err := decoder.Token()
if err != nil {
return fmt.Errorf("decode token: %w", err)
}

if nested == 1 && strings.EqualFold(fmt.Sprintf("%s", token), key) {
break
switch tokenType := token.(type) {
case string:
if nested == 1 && strings.EqualFold(tokenType, key) {
return nil
}

if strToken := fmt.Sprintf("%s", token); strToken == "{" {
case json.Delim:
switch tokenType {
case '{':
nested++
} else if strToken == "}" {
case '}':
nested--
}
}
}

if _, err = decoder.Token(); err != nil {
return fmt.Errorf("read opening token: %w", err)
}

return nil
}

0 comments on commit c90450a

Please sign in to comment.