1
0
mirror of https://github.com/netsampler/goflow2.git synced 2024-05-06 15:54:52 +00:00
2023-08-09 19:47:20 -07:00

91 lines
1.7 KiB
Go

package format
import (
"fmt"
"sync"
)
var (
formatDrivers = make(map[string]FormatDriver)
lock = &sync.RWMutex{}
ErrorFormat = fmt.Errorf("format error")
ErrorNoSerializer = fmt.Errorf("message is not serializable")
)
type DriverFormatError struct {
Driver string
Err error
}
func (e *DriverFormatError) Error() string {
return fmt.Sprintf("%s for %s format", e.Err.Error(), e.Driver)
}
func (e *DriverFormatError) Unwrap() []error {
return []error{ErrorFormat, e.Err}
}
type FormatDriver interface {
Prepare() error // Prepare driver (eg: flag registration)
Init() error // Initialize driver (eg: parse keying)
Format(data interface{}) ([]byte, []byte, error) // Send a message
}
type FormatInterface interface {
Format(data interface{}) ([]byte, []byte, error)
}
type Format struct {
FormatDriver
name string
}
func (t *Format) Format(data interface{}) ([]byte, []byte, error) {
key, text, err := t.FormatDriver.Format(data)
if err != nil {
err = &DriverFormatError{
t.name,
err,
}
}
return key, text, err
}
func RegisterFormatDriver(name string, t FormatDriver) {
lock.Lock()
formatDrivers[name] = t
lock.Unlock()
if err := t.Prepare(); err != nil {
panic(err)
}
}
func FindFormat(name string) (*Format, error) {
lock.RLock()
t, ok := formatDrivers[name]
lock.RUnlock()
if !ok {
return nil, fmt.Errorf("%w %s not found", ErrorFormat, name)
}
err := t.Init()
if err != nil {
err = &DriverFormatError{name, err}
}
return &Format{t, name}, err
}
func GetFormats() []string {
lock.RLock()
defer lock.RUnlock()
t := make([]string, len(formatDrivers))
var i int
for k := range formatDrivers {
t[i] = k
i++
}
return t
}