rs2322tcp/internal/client/device.go
2026-08-10 17:59:35 +02:00

70 lines
1.7 KiB
Go

/*
* ============================================================================
* Projekt.....: rs2322tcp
* Datei.......: internal/client/device.go
* Copyright (C) 2026 Dieter Lang
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Beschreibung:
* Zuordnung eines lokalen virtuellen Ports zu einem vom Server gemeldeten
* Remote-Gerät.
* ============================================================================
*/
package client
import (
"fmt"
"git.lang-dieter.de/rs2322tcp/internal/config"
"git.lang-dieter.de/rs2322tcp/internal/transport"
)
///////////////////////////////////////////////////////////////////////////////
// Remote device lookup
///////////////////////////////////////////////////////////////////////////////
// findRemoteDevice finds the server-provided device information matching
// the remote device ID configured for a local virtual port.
//
// The caller uses the returned RemoteDeviceInfo to open the session-specific
// TCP data connection.
func findRemoteDevice(
virtualPort config.VirtualPortConfig,
devices []transport.RemoteDeviceInfo,
) (transport.RemoteDeviceInfo, error) {
if virtualPort.RemoteDevice == "" {
return transport.RemoteDeviceInfo{}, fmt.Errorf(
"remote device is empty for virtual port %q",
virtualPort.Port,
)
}
var found *transport.RemoteDeviceInfo
for i := range devices {
device := &devices[i]
if device.ID != virtualPort.RemoteDevice {
continue
}
if found != nil {
return transport.RemoteDeviceInfo{}, fmt.Errorf(
"remote device %q is ambiguous",
virtualPort.RemoteDevice,
)
}
found = device
}
if found == nil {
return transport.RemoteDeviceInfo{}, fmt.Errorf(
"remote device %q not found",
virtualPort.RemoteDevice,
)
}
return *found, nil
}