1package yaml
2
3import (
4	"bytes"
5	"encoding/json"
6	"errors"
7	"reflect"
8
9	goyaml "gopkg.in/yaml.v3"
10)
11
12type KeyJSON struct {
13	EscapeHTML bool
14}
15
16func (k *KeyJSON) Marshal(v interface{}) ([]byte, error) {
17	keyJSON := &bytes.Buffer{}
18	jsonEnc := json.NewEncoder(keyJSON)
19	jsonEnc.SetEscapeHTML(k.EscapeHTML)
20	if err := jsonEnc.Encode(v); err != nil {
21		return nil, err
22	}
23	return keyJSON.Bytes()[:keyJSON.Len()-1], nil
24}
25
26func (k *KeyJSON) Unmarshal(src []byte, v interface{}) error {
27	if !json.Valid(src) {
28		var null interface{}
29		err := json.Unmarshal(src, &null)
30		if err == nil {
31			err = errors.New("invalid JSON")
32		}
33		return err
34	}
35	r := bytes.NewReader(src)
36	var node goyaml.Node
37	if err := goyaml.NewDecoder(r).Decode(&node); err != nil {
38		return err
39	}
40	dec := &Decoder{}
41	out, err := dec.Decode(&node)
42	if err != nil {
43		return err
44	}
45	val := reflect.ValueOf(v).Elem()
46	if !val.CanSet() {
47		return errors.New("cannot set value")
48	}
49	val.Set(reflect.ValueOf(out))
50	return nil
51}
52