1
0
mirror of https://github.com/netsampler/goflow2.git synced 2024-05-06 15:54:52 +00:00

94 lines
1.9 KiB
Go
Raw Normal View History

2021-05-22 16:12:26 -07:00
package transport
import (
"fmt"
"sync"
)
var (
transportDrivers = make(map[string]TransportDriver)
lock = &sync.RWMutex{}
2023-08-09 19:47:20 -07:00
ErrorTransport = fmt.Errorf("transport error")
2021-05-22 16:12:26 -07:00
)
2023-08-09 19:47:20 -07:00
type DriverTransportError struct {
Driver string
Err error
}
func (e *DriverTransportError) Error() string {
return fmt.Sprintf("%s for %s transport", e.Err.Error(), e.Driver)
}
func (e *DriverTransportError) Unwrap() []error {
return []error{ErrorTransport, e.Err}
}
2021-05-22 16:12:26 -07:00
type TransportDriver interface {
Prepare() error // Prepare driver (eg: flag registration)
2023-08-09 19:47:20 -07:00
Init() error // Initialize driver (eg: start connections, open files...)
Close() error // Close driver (eg: close connections and files...)
2021-05-22 16:12:26 -07:00
Send(key, data []byte) error // Send a formatted message
}
type TransportInterface interface {
Send(key, data []byte) error
}
type Transport struct {
2023-08-09 19:47:20 -07:00
TransportDriver
name string
2021-05-22 16:12:26 -07:00
}
2023-08-09 19:47:20 -07:00
func (t *Transport) Close() error {
if err := t.TransportDriver.Close(); err != nil {
return &DriverTransportError{t.name, err}
}
return nil
2021-05-22 16:12:26 -07:00
}
2023-08-09 19:47:20 -07:00
2021-05-22 16:12:26 -07:00
func (t *Transport) Send(key, data []byte) error {
2023-08-09 19:47:20 -07:00
if err := t.TransportDriver.Send(key, data); err != nil {
return &DriverTransportError{t.name, err}
}
return nil
2021-05-22 16:12:26 -07:00
}
func RegisterTransportDriver(name string, t TransportDriver) {
lock.Lock()
transportDrivers[name] = t
lock.Unlock()
if err := t.Prepare(); err != nil {
panic(err)
}
}
2023-08-09 19:47:20 -07:00
func FindTransport(name string) (*Transport, error) {
2021-05-22 16:12:26 -07:00
lock.RLock()
t, ok := transportDrivers[name]
lock.RUnlock()
if !ok {
2023-08-09 19:47:20 -07:00
return nil, fmt.Errorf("%w %s not found", ErrorTransport, name)
2021-05-22 16:12:26 -07:00
}
2023-08-09 19:47:20 -07:00
err := t.Init()
if err != nil {
err = &DriverTransportError{name, err}
}
return &Transport{t, name}, err
2021-05-22 16:12:26 -07:00
}
func GetTransports() []string {
lock.RLock()
defer lock.RUnlock()
2021-05-22 16:12:26 -07:00
t := make([]string, len(transportDrivers))
var i int
2023-08-09 19:47:20 -07:00
for k := range transportDrivers {
2021-05-22 16:12:26 -07:00
t[i] = k
i++
}
return t
}