package utils

import (
	"errors"
	"iter"

	"github.com/tidwall/gjson"
)

var (
	ErrGjsonNotFound  = errors.New("specified path does not exist")
	ErrGjsonWrongType = errors.New("wrong type")
)

var emptyIterator = func(yield func(string, string) bool) {}

func GjsonGet(json []byte, path string) (gjson.Result, error) {
	result := gjson.GetBytes(json, path)
	if !result.Exists() {
		return result, ErrGjsonNotFound
	}

	return result, nil
}

func GjsonIter(json string) (iter.Seq2[string, string], error) {
	if json == "" {
		return emptyIterator, nil
	}

	result := gjson.Parse(json)
	if !result.IsObject() {
		return nil, ErrGjsonWrongType
	}

	return func(yield func(string, string) bool) {
		result.ForEach(func(k, v gjson.Result) bool {
			return yield(k.String(), v.String())
		})
	}, nil
}