...
1 package json
2
3 import (
4 "bytes"
5 "sync"
6 "sync/atomic"
7
8 "github.com/lestrrat-go/jwx/internal/base64"
9 "github.com/pkg/errors"
10 )
11
12 var muGlobalConfig sync.RWMutex
13 var useNumber bool
14
15
16 func DecoderSettings(inUseNumber bool) {
17 muGlobalConfig.Lock()
18 useNumber = inUseNumber
19 muGlobalConfig.Unlock()
20 }
21
22
23
24 func Unmarshal(b []byte, v interface{}) error {
25 dec := NewDecoder(bytes.NewReader(b))
26 return dec.Decode(v)
27 }
28
29 func AssignNextBytesToken(dst *[]byte, dec *Decoder) error {
30 var val string
31 if err := dec.Decode(&val); err != nil {
32 return errors.Wrap(err, `error reading next value`)
33 }
34
35 buf, err := base64.DecodeString(val)
36 if err != nil {
37 return errors.Errorf(`expected base64 encoded []byte (%T)`, val)
38 }
39 *dst = buf
40 return nil
41 }
42
43 func ReadNextStringToken(dec *Decoder) (string, error) {
44 var val string
45 if err := dec.Decode(&val); err != nil {
46 return "", errors.Wrap(err, `error reading next value`)
47 }
48 return val, nil
49 }
50
51 func AssignNextStringToken(dst **string, dec *Decoder) error {
52 val, err := ReadNextStringToken(dec)
53 if err != nil {
54 return err
55 }
56 *dst = &val
57 return nil
58 }
59
60
61
62
63
64
65
66
67
68
69 var FlattenAudience uint32
70
71 func EncodeAudience(enc *Encoder, aud []string) error {
72 var val interface{}
73 if len(aud) == 1 && atomic.LoadUint32(&FlattenAudience) == 1 {
74 val = aud[0]
75 } else {
76 val = aud
77 }
78 return enc.Encode(val)
79 }
80
81
82
83 type DecodeCtx interface {
84 Registry() *Registry
85 }
86
87
88
89 type DecodeCtxContainer interface {
90 DecodeCtx() DecodeCtx
91 SetDecodeCtx(DecodeCtx)
92 }
93
94
95 type decodeCtx struct {
96 registry *Registry
97 }
98
99 func NewDecodeCtx(r *Registry) DecodeCtx {
100 return &decodeCtx{registry: r}
101 }
102
103 func (dc *decodeCtx) Registry() *Registry {
104 return dc.registry
105 }
106
View as plain text