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  }