aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/args.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2015-04-21 23:31:08 +0800
committerPéter Szilágyi <peterke@gmail.com>2015-04-28 15:49:04 +0800
commitae4bfc3cfb3f1debad9dd0211950ce09038ffa90 (patch)
treed09f6c0291eab1b02cc1145b816542024e7c4bfa /rpc/args.go
parent15586368e52f49a0f7ea28f890af49d196760846 (diff)
downloadgo-tangerine-ae4bfc3cfb3f1debad9dd0211950ce09038ffa90.tar.gz
go-tangerine-ae4bfc3cfb3f1debad9dd0211950ce09038ffa90.tar.zst
go-tangerine-ae4bfc3cfb3f1debad9dd0211950ce09038ffa90.zip
rpc, ui/qt/qwhisper, whisper, xeth: introduce complex topic filters
Diffstat (limited to 'rpc/args.go')
-rw-r--r--rpc/args.go69
1 files changed, 53 insertions, 16 deletions
diff --git a/rpc/args.go b/rpc/args.go
index 7694a3d3f..8df483f08 100644
--- a/rpc/args.go
+++ b/rpc/args.go
@@ -1010,25 +1010,27 @@ func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) {
}
type WhisperFilterArgs struct {
- To string `json:"to"`
+ To string
From string
- Topics []string
+ Topics [][]string
}
+// UnmarshalJSON implements the json.Unmarshaler interface, invoked to convert a
+// JSON message blob into a WhisperFilterArgs structure.
func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) {
+ // Unmarshal the JSON message and sanity check
var obj []struct {
- To interface{}
- Topics []interface{}
+ To interface{} `json:"to"`
+ From interface{} `json:"from"`
+ Topics interface{} `json:"topics"`
}
-
- if err = json.Unmarshal(b, &obj); err != nil {
+ if err := json.Unmarshal(b, &obj); err != nil {
return NewDecodeParamError(err.Error())
}
-
if len(obj) < 1 {
return NewInsufficientParamsError(len(obj), 1)
}
-
+ // Retrieve the simple data contents of the filter arguments
if obj[0].To == nil {
args.To = ""
} else {
@@ -1038,17 +1040,52 @@ func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) {
}
args.To = argstr
}
-
- t := make([]string, len(obj[0].Topics))
- for i, j := range obj[0].Topics {
- argstr, ok := j.(string)
+ if obj[0].From == nil {
+ args.From = ""
+ } else {
+ argstr, ok := obj[0].From.(string)
if !ok {
- return NewInvalidTypeError("topics["+string(i)+"]", "is not a string")
+ return NewInvalidTypeError("from", "is not a string")
}
- t[i] = argstr
+ args.From = argstr
+ }
+ // Construct the nested topic array
+ if obj[0].Topics != nil {
+ // Make sure we have an actual topic array
+ list, ok := obj[0].Topics.([]interface{})
+ if !ok {
+ return NewInvalidTypeError("topics", "is not an array")
+ }
+ // Iterate over each topic and handle nil, string or array
+ topics := make([][]string, len(list))
+ for idx, field := range list {
+ switch value := field.(type) {
+ case nil:
+ topics[idx] = []string{""}
+
+ case string:
+ topics[idx] = []string{value}
+
+ case []interface{}:
+ topics[idx] = make([]string, len(value))
+ for i, nested := range value {
+ switch value := nested.(type) {
+ case nil:
+ topics[idx][i] = ""
+
+ case string:
+ topics[idx][i] = value
+
+ default:
+ return NewInvalidTypeError(fmt.Sprintf("topic[%d][%d]", idx, i), "is not a string")
+ }
+ }
+ default:
+ return NewInvalidTypeError(fmt.Sprintf("topic[%d]", idx), "not a string or array")
+ }
+ }
+ args.Topics = topics
}
- args.Topics = t
-
return nil
}