-
Notifications
You must be signed in to change notification settings - Fork 109
/
client.go
100 lines (91 loc) · 2.7 KB
/
client.go
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Package sensors contains a gRPC based sensors service client
package sensors
import (
"context"
commonpb "go.viam.com/api/common/v1"
pb "go.viam.com/api/service/sensors/v1"
"go.viam.com/utils/protoutils"
"go.viam.com/utils/rpc"
"go.viam.com/rdk/logging"
rprotoutils "go.viam.com/rdk/protoutils"
"go.viam.com/rdk/resource"
)
// client implements SensorsServiceClient.
type client struct {
resource.Named
resource.TriviallyReconfigurable
resource.TriviallyCloseable
name string
client pb.SensorsServiceClient
logger logging.Logger
}
// NewClientFromConn constructs a new Client from connection passed in.
func NewClientFromConn(
ctx context.Context,
conn rpc.ClientConn,
remoteName string,
name resource.Name,
logger logging.Logger,
) (Service, error) {
grpcClient := pb.NewSensorsServiceClient(conn)
c := &client{
Named: name.PrependRemote(remoteName).AsNamed(),
name: name.ShortName(),
client: grpcClient,
logger: logger,
}
return c, nil
}
func (c *client) Sensors(ctx context.Context, extra map[string]interface{}) ([]resource.Name, error) {
ext, err := protoutils.StructToStructPb(extra)
if err != nil {
return nil, err
}
//nolint:staticcheck
resp, err := c.client.GetSensors(ctx, &pb.GetSensorsRequest{Name: c.name, Extra: ext})
if err != nil {
return nil, err
}
//nolint:staticcheck
sensorNames := make([]resource.Name, 0, len(resp.SensorNames))
//nolint:staticcheck
for _, name := range resp.SensorNames {
sensorNames = append(sensorNames, rprotoutils.ResourceNameFromProto(name))
}
return sensorNames, nil
}
func (c *client) Readings(ctx context.Context, sensorNames []resource.Name, extra map[string]interface{}) ([]Readings, error) {
names := make([]*commonpb.ResourceName, 0, len(sensorNames))
for _, name := range sensorNames {
names = append(names, rprotoutils.ResourceNameToProto(name))
}
ext, err := protoutils.StructToStructPb(extra)
if err != nil {
return nil, err
}
//nolint:staticcheck
resp, err := c.client.GetReadings(ctx, &pb.GetReadingsRequest{Name: c.name, SensorNames: names, Extra: ext})
if err != nil {
return nil, err
}
//nolint:staticcheck
readings := make([]Readings, 0, len(resp.Readings))
//nolint:staticcheck
for _, reading := range resp.Readings {
//nolint:staticcheck
sReading, err := rprotoutils.ReadingProtoToGo(reading.Readings)
if err != nil {
return nil, err
}
readings = append(
readings, Readings{
//nolint:staticcheck
Name: rprotoutils.ResourceNameFromProto(reading.Name),
Readings: sReading,
})
}
return readings, nil
}
func (c *client) DoCommand(ctx context.Context, cmd map[string]interface{}) (map[string]interface{}, error) {
return rprotoutils.DoFromResourceClient(ctx, c.client, c.name, cmd)
}