mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-12-04 19:19:44 +00:00
transaction: add json.Unmarshaler to Attribute
It actually was missing and it might affect Transaction conversion to/from JSON.
This commit is contained in:
parent
8f55f0ac76
commit
83febead59
1 changed files with 110 additions and 5 deletions
|
@ -3,6 +3,7 @@ package transaction
|
|||
import (
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||
|
@ -10,8 +11,14 @@ import (
|
|||
|
||||
// Attribute represents a Transaction attribute.
|
||||
type Attribute struct {
|
||||
Usage AttrUsage `json:"usage"`
|
||||
Data []byte `json:"data"`
|
||||
Usage AttrUsage
|
||||
Data []byte
|
||||
}
|
||||
|
||||
// attrJSON is used for JSON I/O of Attribute.
|
||||
type attrJSON struct {
|
||||
Usage string `json:"usage"`
|
||||
Data string `json:"data"`
|
||||
}
|
||||
|
||||
// DecodeBinary implements Serializable interface.
|
||||
|
@ -72,8 +79,106 @@ func (attr *Attribute) EncodeBinary(bw *io.BinWriter) {
|
|||
|
||||
// MarshalJSON implements the json Marshaller interface.
|
||||
func (attr *Attribute) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(map[string]string{
|
||||
"usage": attr.Usage.String(),
|
||||
"data": hex.EncodeToString(attr.Data),
|
||||
return json.Marshal(attrJSON{
|
||||
Usage: attr.Usage.String(),
|
||||
Data: hex.EncodeToString(attr.Data),
|
||||
})
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements the json.Unmarshaller interface.
|
||||
func (attr *Attribute) UnmarshalJSON(data []byte) error {
|
||||
aj := new(attrJSON)
|
||||
err := json.Unmarshal(data, aj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
binData, err := hex.DecodeString(aj.Data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch aj.Usage {
|
||||
case "ContractHash":
|
||||
attr.Usage = ContractHash
|
||||
case "ECDH02":
|
||||
attr.Usage = ECDH02
|
||||
case "ECDH03":
|
||||
attr.Usage = ECDH03
|
||||
case "Script":
|
||||
attr.Usage = Script
|
||||
case "Vote":
|
||||
attr.Usage = Vote
|
||||
case "CertURL":
|
||||
attr.Usage = CertURL
|
||||
case "DescriptionURL":
|
||||
attr.Usage = DescriptionURL
|
||||
case "Description":
|
||||
attr.Usage = Description
|
||||
case "Hash1":
|
||||
attr.Usage = Hash1
|
||||
case "Hash2":
|
||||
attr.Usage = Hash2
|
||||
case "Hash3":
|
||||
attr.Usage = Hash3
|
||||
case "Hash4":
|
||||
attr.Usage = Hash4
|
||||
case "Hash5":
|
||||
attr.Usage = Hash5
|
||||
case "Hash6":
|
||||
attr.Usage = Hash6
|
||||
case "Hash7":
|
||||
attr.Usage = Hash7
|
||||
case "Hash8":
|
||||
attr.Usage = Hash8
|
||||
case "Hash9":
|
||||
attr.Usage = Hash9
|
||||
case "Hash10":
|
||||
attr.Usage = Hash10
|
||||
case "Hash11":
|
||||
attr.Usage = Hash11
|
||||
case "Hash12":
|
||||
attr.Usage = Hash12
|
||||
case "Hash13":
|
||||
attr.Usage = Hash13
|
||||
case "Hash14":
|
||||
attr.Usage = Hash14
|
||||
case "Hash15":
|
||||
attr.Usage = Hash15
|
||||
case "Remark":
|
||||
attr.Usage = Remark
|
||||
case "Remark1":
|
||||
attr.Usage = Remark1
|
||||
case "Remark2":
|
||||
attr.Usage = Remark2
|
||||
case "Remark3":
|
||||
attr.Usage = Remark3
|
||||
case "Remark4":
|
||||
attr.Usage = Remark4
|
||||
case "Remark5":
|
||||
attr.Usage = Remark5
|
||||
case "Remark6":
|
||||
attr.Usage = Remark6
|
||||
case "Remark7":
|
||||
attr.Usage = Remark7
|
||||
case "Remark8":
|
||||
attr.Usage = Remark8
|
||||
case "Remark9":
|
||||
attr.Usage = Remark9
|
||||
case "Remark10":
|
||||
attr.Usage = Remark10
|
||||
case "Remark11":
|
||||
attr.Usage = Remark11
|
||||
case "Remark12":
|
||||
attr.Usage = Remark12
|
||||
case "Remark13":
|
||||
attr.Usage = Remark13
|
||||
case "Remark14":
|
||||
attr.Usage = Remark14
|
||||
case "Remark15":
|
||||
attr.Usage = Remark15
|
||||
default:
|
||||
return errors.New("wrong Usage")
|
||||
|
||||
}
|
||||
attr.Data = binData
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue