src.dualinventive.com/go/dinet/dinet.go

107 lines
2.4 KiB
Go

package dinet
import (
"errors"
"time"
"src.dualinventive.com/go/dinet/rpc"
)
// Transport is the type of Transport to encode/decode rpc messages
type Transport int
const (
// TransportLowlevel is the Transport for encoding/decoding low level messages
TransportLowlevel Transport = iota
// TransportZmq is the Transport for encoding/decoding Zmq messages
TransportZmq
// TransportTest is a test-transport used for testing DI-Net connections
TransportTest
)
// Reader interface allows reading of RPC messages
type Reader interface {
Recv() (*rpc.Msg, error)
}
// Writer interface allows writing RPC messages
type Writer interface {
Send(*rpc.Msg) error
}
// Closer interface allows closing the RPC interface
type Closer interface {
Close() error
}
// ReadCloser implements the Reader and Closer interface
type ReadCloser interface {
Reader
Closer
}
// WriteCloser implements the Writer and Closer interface
type WriteCloser interface {
Writer
Closer
}
// ReadWriter implements the Reader and Writer interface
type ReadWriter interface {
Reader
Writer
}
// ReadWriteCloser implements the Reader, Writer and Closer interface
type ReadWriteCloser interface {
Reader
Writer
Closer
}
// Conn is a DI-Net connection, reading/writing RPC messages via different transports
type Conn interface {
ReadWriteCloser
Connect(string) error
Reconnect() error
SetTimeout(timeout time.Duration) error
}
// DeviceConn is a DI-Net connection which provides an interface for device abstraction
type DeviceConn interface {
Conn
DeviceHandshake(string) error
DeviceRegister(string) error
DeviceUnregister(string) error
}
// Compile-time interface validation
var _ DeviceConn = &LowLevelTransport{}
var _ DeviceConn = &TestTransport{}
var _ Conn = &ZmqTransport{}
// NewConn creates a new connection based on the given Transport
func NewConn(enc Transport) (Conn, error) {
switch enc {
case TransportTest:
return &TestTransport{}, nil
case TransportLowlevel:
return &LowLevelTransport{}, nil
case TransportZmq:
return &ZmqTransport{timeout: ZmqTransportTimeoutInfinite}, nil
}
return nil, errors.New("not supported")
}
// NewDeviceConn creates a new device-based connection based on the given Transport
func NewDeviceConn(enc Transport) (DeviceConn, error) {
switch enc {
case TransportLowlevel:
return &LowLevelTransport{}, nil
case TransportTest:
return &TestTransport{}, nil
}
return nil, errors.New("not supported")
}