-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmessage.go
More file actions
83 lines (75 loc) · 2 KB
/
Copy pathmessage.go
File metadata and controls
83 lines (75 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
* Licensed Materials - Property of tenxcloud.com
* (C) Copyright 2019 TenxCloud. All Rights Reserved.
* 2019-03-20 @author lizhen
*/
package serviced
import (
"reflect"
)
type object struct {
Type string
Value []byte
}
type Message struct {
RequestID string
IsResponse bool
Service string
Method string
Arguments []object
ReturnValues []object
}
func objectToInterface(kernel Kernel, serializer Serializer, objects []object) (interfaces []interface{}, err error) {
var values []reflect.Value
if values, err = objectToValue(kernel, serializer, objects); err != nil {
return
}
count := len(values)
interfaces = make([]interface{}, count)
for i := 0; i < count; i++ {
interfaces[i] = values[i].Interface()
}
return
}
func interfaceToObject(serializer Serializer, interfaces []interface{}) (objects []object, err error) {
count := len(interfaces)
objects = make([]object, count)
for i := 0; i < count; i++ {
argument := interfaces[i]
var value []byte
if value, err = serializer.Serialize(argument); err != nil {
return
}
objects[i] = object{
Type: reflect.Indirect(reflect.ValueOf(argument)).Type().String(),
Value: value,
}
}
return
}
func objectToValue(kernel Kernel, serializer Serializer, objects []object) (values []reflect.Value, err error) {
count := len(objects)
values = make([]reflect.Value, count)
for i := 0; i < count; i++ {
object := &(objects[i])
var theType reflect.Type
if theType, err = kernel.ResolveType(object.Type); err != nil {
return
}
rv := reflect.New(theType)
if err = serializer.Deserialize(object.Value, rv.Interface()); err != nil {
return
}
values[i] = reflect.Indirect(rv)
}
return
}
func valueToObject(serializer Serializer, values []reflect.Value) (objects []object, err error) {
count := len(values)
interfaces := make([]interface{}, count)
for i := 0; i < count; i++ {
interfaces[i] = reflect.Indirect(values[i]).Interface()
}
objects, err = interfaceToObject(serializer, interfaces)
return
}