decred.org/dcrwallet/v3@v3.1.0/internal/rpc/jsonrpc/marshaling.go (about) 1 package jsonrpc 2 3 import ( 4 "bytes" 5 "encoding/json" 6 7 "decred.org/dcrwallet/v3/wallet" 8 ) 9 10 type marshalJSONFunc func() ([]byte, error) 11 12 func (f marshalJSONFunc) MarshalJSON() ([]byte, error) { return f() } 13 14 func addressArrayMarshaler(n int, s func(i int) string) json.Marshaler { 15 return marshalJSONFunc(func() ([]byte, error) { 16 // Make buffer of estimated needed size. Base58 Hash160 17 // addresses are typically 35 characters long, plus 3 additional 18 // characters per item for string quotes and comma. Minimum two 19 // characters are needed for the outer []. 20 buf := new(bytes.Buffer) 21 buf.Grow(2 + n*(3+35)) 22 23 buf.WriteByte('[') 24 for i := 0; i < n; i++ { 25 if i != 0 { 26 buf.WriteByte(',') 27 } 28 buf.WriteByte('"') 29 buf.WriteString(s(i)) 30 buf.WriteByte('"') 31 } 32 buf.WriteByte(']') 33 34 return buf.Bytes(), nil 35 }) 36 } 37 38 func knownAddressMarshaler(addrs []wallet.KnownAddress) json.Marshaler { 39 return addressArrayMarshaler(len(addrs), func(i int) string { 40 return addrs[i].String() 41 }) 42 } 43 44 func addressStringsMarshaler(addrs []string) json.Marshaler { 45 return addressArrayMarshaler(len(addrs), func(i int) string { 46 return addrs[i] 47 }) 48 }