mirror of
https://github.com/netsampler/goflow2.git
synced 2024-05-06 15:54:52 +00:00
65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
package format
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
formatDrivers = make(map[string]FormatDriver)
|
|
lock = &sync.RWMutex{}
|
|
)
|
|
|
|
type FormatDriver interface {
|
|
Prepare() error // Prepare driver (eg: flag registration)
|
|
Init(context.Context) 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 {
|
|
driver FormatDriver
|
|
}
|
|
|
|
func (t *Format) Format(data interface{}) ([]byte, []byte, error) {
|
|
return t.driver.Format(data)
|
|
}
|
|
|
|
func RegisterFormatDriver(name string, t FormatDriver) {
|
|
lock.Lock()
|
|
formatDrivers[name] = t
|
|
lock.Unlock()
|
|
|
|
if err := t.Prepare(); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func FindFormat(ctx context.Context, name string) (*Format, error) {
|
|
lock.RLock()
|
|
t, ok := formatDrivers[name]
|
|
lock.RUnlock()
|
|
if !ok {
|
|
return nil, fmt.Errorf("Format %s not found", name)
|
|
}
|
|
|
|
err := t.Init(ctx)
|
|
return &Format{t}, err
|
|
}
|
|
|
|
func GetFormats() []string {
|
|
lock.RLock()
|
|
t := make([]string, len(formatDrivers))
|
|
var i int
|
|
for k, _ := range formatDrivers {
|
|
t[i] = k
|
|
i++
|
|
}
|
|
lock.RUnlock()
|
|
return t
|
|
}
|