// Package econetgrpc implements the EconetService gRPC API over a shared // econetclient.Client, exposing read-only device state. package econetgrpc import ( "context" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" grpccodes "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "gitea.libretechconsulting.com/rmcguire/go-app/pkg/otel" pb "gitea.libretechconsulting.com/rmcguire/econet-exporter/api/econet/v1alpha1" "gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/config" "gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/econet/econetclient" ) type EconetGRPCServer struct { tracer trace.Tracer ctx context.Context cfg *config.ServiceConfig client *econetclient.Client pb.UnimplementedEconetServiceServer } func NewEconetGRPCServer(ctx context.Context, cfg *config.ServiceConfig, client *econetclient.Client) *EconetGRPCServer { return &EconetGRPCServer{ ctx: ctx, cfg: cfg, client: client, tracer: otel.GetTracer(ctx, "econetGRPCServer"), } } func (s *EconetGRPCServer) ListDevices(ctx context.Context, _ *pb.ListDevicesRequest) ( *pb.ListDevicesResponse, error, ) { _, span := s.tracer.Start(ctx, "listDevices") defer span.End() devices := s.client.Devices() resp := &pb.ListDevicesResponse{Devices: make([]*pb.Device, 0, len(devices))} for _, d := range devices { resp.Devices = append(resp.Devices, deviceToProto(d)) } span.SetAttributes(attribute.Int("devices", len(resp.Devices))) span.SetStatus(codes.Ok, "") return resp, nil } func (s *EconetGRPCServer) GetDevice(ctx context.Context, req *pb.GetDeviceRequest) ( *pb.GetDeviceResponse, error, ) { _, span := s.tracer.Start(ctx, "getDevice", trace.WithAttributes( attribute.String("serialNumber", req.GetSerialNumber()), )) defer span.End() d := s.client.Device(req.GetSerialNumber()) if d == nil { err := status.Errorf(grpccodes.NotFound, "no device with serial %q", req.GetSerialNumber()) span.SetStatus(codes.Error, err.Error()) return nil, err } span.SetStatus(codes.Ok, "") return &pb.GetDeviceResponse{Device: deviceToProto(d)}, nil }