forked from TrueCloudLab/neoneo-go
rpc: signal JSON marshalling errors through exception
See neo-project/neo-modules#696. Unmarshaller is left unchanged to be compatible.
This commit is contained in:
parent
7f8b259994
commit
930c439900
1 changed files with 15 additions and 11 deletions
|
@ -95,21 +95,26 @@ func (r *Invoke) Finalize() {
|
||||||
// MarshalJSON implements json.Marshaler.
|
// MarshalJSON implements json.Marshaler.
|
||||||
func (r Invoke) MarshalJSON() ([]byte, error) {
|
func (r Invoke) MarshalJSON() ([]byte, error) {
|
||||||
defer r.Finalize()
|
defer r.Finalize()
|
||||||
var st json.RawMessage
|
var (
|
||||||
arr := make([]json.RawMessage, len(r.Stack))
|
st json.RawMessage
|
||||||
|
err error
|
||||||
|
faultSep string
|
||||||
|
arr = make([]json.RawMessage, len(r.Stack))
|
||||||
|
)
|
||||||
|
if len(r.FaultException) != 0 {
|
||||||
|
faultSep = " / "
|
||||||
|
}
|
||||||
|
arrloop:
|
||||||
for i := range arr {
|
for i := range arr {
|
||||||
var (
|
var data []byte
|
||||||
data []byte
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
if (r.Stack[i].Type() == stackitem.InteropT) && iterator.IsIterator(r.Stack[i]) {
|
if (r.Stack[i].Type() == stackitem.InteropT) && iterator.IsIterator(r.Stack[i]) {
|
||||||
iteratorValues, truncated := iterator.Values(r.Stack[i], r.maxIteratorResultItems)
|
iteratorValues, truncated := iterator.Values(r.Stack[i], r.maxIteratorResultItems)
|
||||||
value := make([]json.RawMessage, len(iteratorValues))
|
value := make([]json.RawMessage, len(iteratorValues))
|
||||||
for j := range iteratorValues {
|
for j := range iteratorValues {
|
||||||
value[j], err = stackitem.ToJSONWithTypes(iteratorValues[j])
|
value[j], err = stackitem.ToJSONWithTypes(iteratorValues[j])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
st = []byte(fmt.Sprintf(`"error: %v"`, err))
|
r.FaultException += fmt.Sprintf("%sjson error: %v", faultSep, err)
|
||||||
break
|
break arrloop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data, err = json.Marshal(iteratorAux{
|
data, err = json.Marshal(iteratorAux{
|
||||||
|
@ -123,15 +128,14 @@ func (r Invoke) MarshalJSON() ([]byte, error) {
|
||||||
} else {
|
} else {
|
||||||
data, err = stackitem.ToJSONWithTypes(r.Stack[i])
|
data, err = stackitem.ToJSONWithTypes(r.Stack[i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
st = []byte(fmt.Sprintf(`"error: %v"`, err))
|
r.FaultException += fmt.Sprintf("%sjson error: %v", faultSep, err)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
arr[i] = data
|
arr[i] = data
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
if err == nil {
|
||||||
if st == nil {
|
|
||||||
st, err = json.Marshal(arr)
|
st, err = json.Marshal(arr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
Loading…
Reference in a new issue