mirror of
https://github.com/jwetzell/showbridge-go.git
synced 2026-04-28 13:55:28 +00:00
move any helper methods to common and reuse for params getter
This commit is contained in:
179
internal/common/common.go
Normal file
179
internal/common/common.go
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetAnyAs[T any](value any) (T, bool) {
|
||||||
|
typed, ok := value.(T)
|
||||||
|
return typed, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAnyAsInt(value any) (int, bool) {
|
||||||
|
|
||||||
|
intValue, ok := value.(int)
|
||||||
|
if ok {
|
||||||
|
return intValue, true
|
||||||
|
}
|
||||||
|
|
||||||
|
uintValue, ok := value.(uint)
|
||||||
|
if ok {
|
||||||
|
return int(uintValue), true
|
||||||
|
}
|
||||||
|
|
||||||
|
byteValue, ok := value.(byte)
|
||||||
|
if ok {
|
||||||
|
return int(byteValue), true
|
||||||
|
}
|
||||||
|
|
||||||
|
floatValue, ok := value.(float64)
|
||||||
|
if ok {
|
||||||
|
if floatValue != math.Floor(floatValue) {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
return int(floatValue), true
|
||||||
|
}
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAnyAsByteSlice(value any) ([]byte, bool) {
|
||||||
|
v := reflect.ValueOf(value)
|
||||||
|
if v.Kind() != reflect.Slice {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
result := make([]byte, v.Len())
|
||||||
|
for i := 0; i < v.Len(); i++ {
|
||||||
|
elem := v.Index(i).Interface()
|
||||||
|
byteValue, ok := elem.(byte)
|
||||||
|
if ok {
|
||||||
|
result[i] = byteValue
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
uintValue, ok := elem.(uint)
|
||||||
|
if ok {
|
||||||
|
if uintValue > 255 {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
result[i] = byte(uintValue)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
intValue, ok := elem.(int)
|
||||||
|
if ok {
|
||||||
|
if intValue < 0 || intValue > 255 {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
result[i] = byte(intValue)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
floatValue, ok := elem.(float64)
|
||||||
|
if ok {
|
||||||
|
if floatValue != math.Floor(floatValue) {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
if floatValue < 0 || floatValue > 255 {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
result[i] = byte(floatValue)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
return result, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAnyAsIntSlice(value any) ([]int, bool) {
|
||||||
|
v := reflect.ValueOf(value)
|
||||||
|
if v.Kind() != reflect.Slice {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
result := make([]int, v.Len())
|
||||||
|
for i := 0; i < v.Len(); i++ {
|
||||||
|
elem := v.Index(i).Interface()
|
||||||
|
byteValue, ok := elem.(byte)
|
||||||
|
if ok {
|
||||||
|
result[i] = int(byteValue)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
uintValue, ok := elem.(uint)
|
||||||
|
if ok {
|
||||||
|
result[i] = int(uintValue)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
intValue, ok := elem.(int)
|
||||||
|
if ok {
|
||||||
|
result[i] = int(intValue)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
floatValue, ok := elem.(float64)
|
||||||
|
if ok {
|
||||||
|
if floatValue != math.Floor(floatValue) {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
result[i] = int(floatValue)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
return result, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAnyAsFloat32(value any) (float32, bool) {
|
||||||
|
float32Value, ok := value.(float32)
|
||||||
|
if ok {
|
||||||
|
return float32Value, true
|
||||||
|
}
|
||||||
|
|
||||||
|
float64Value, ok := value.(float64)
|
||||||
|
if ok {
|
||||||
|
return float32(float64Value), true
|
||||||
|
}
|
||||||
|
|
||||||
|
intValue, ok := value.(int)
|
||||||
|
if ok {
|
||||||
|
return float32(intValue), true
|
||||||
|
}
|
||||||
|
|
||||||
|
uintValue, ok := value.(uint)
|
||||||
|
if ok {
|
||||||
|
return float32(uintValue), true
|
||||||
|
}
|
||||||
|
|
||||||
|
byteValue, ok := value.(byte)
|
||||||
|
if ok {
|
||||||
|
return float32(byteValue), true
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAnyAsFloat64(value any) (float64, bool) {
|
||||||
|
float64Value, ok := value.(float64)
|
||||||
|
if ok {
|
||||||
|
return float64Value, true
|
||||||
|
}
|
||||||
|
|
||||||
|
float32Value, ok := value.(float32)
|
||||||
|
if ok {
|
||||||
|
return float64(float32Value), true
|
||||||
|
}
|
||||||
|
|
||||||
|
intValue, ok := value.(int)
|
||||||
|
if ok {
|
||||||
|
return float64(intValue), true
|
||||||
|
}
|
||||||
|
|
||||||
|
uintValue, ok := value.(uint)
|
||||||
|
if ok {
|
||||||
|
return float64(uintValue), true
|
||||||
|
}
|
||||||
|
|
||||||
|
byteValue, ok := value.(byte)
|
||||||
|
if ok {
|
||||||
|
return float64(byteValue), true
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
@@ -1,269 +1,10 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"math"
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Modules []ModuleConfig `json:"modules"`
|
Modules []ModuleConfig `json:"modules"`
|
||||||
Routes []RouteConfig `json:"routes"`
|
Routes []RouteConfig `json:"routes"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Params map[string]any
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrParamNotFound = errors.New("not found")
|
|
||||||
ErrParamNotString = errors.New("not a string")
|
|
||||||
ErrParamNotNumber = errors.New("not a number")
|
|
||||||
ErrParamNotInteger = errors.New("not an integer")
|
|
||||||
ErrParamNotBool = errors.New("not a boolean")
|
|
||||||
ErrParamNotSlice = errors.New("not a slice")
|
|
||||||
)
|
|
||||||
|
|
||||||
func (p Params) GetString(key string) (string, error) {
|
|
||||||
value, ok := p[key]
|
|
||||||
if !ok {
|
|
||||||
return "", ErrParamNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
stringValue, ok := value.(string)
|
|
||||||
if !ok {
|
|
||||||
return "", ErrParamNotString
|
|
||||||
}
|
|
||||||
return stringValue, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p Params) GetInt(key string) (int, error) {
|
|
||||||
value, ok := p[key]
|
|
||||||
if !ok {
|
|
||||||
return 0, ErrParamNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
intValue, ok := value.(int)
|
|
||||||
if ok {
|
|
||||||
return intValue, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
uintValue, ok := value.(uint)
|
|
||||||
if ok {
|
|
||||||
return int(uintValue), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
byteValue, ok := value.(byte)
|
|
||||||
if ok {
|
|
||||||
return int(byteValue), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
floatValue, ok := value.(float64)
|
|
||||||
if ok {
|
|
||||||
if floatValue != math.Floor(floatValue) {
|
|
||||||
return 0, ErrParamNotInteger
|
|
||||||
}
|
|
||||||
return int(floatValue), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0, ErrParamNotNumber
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p Params) GetFloat32(key string) (float32, error) {
|
|
||||||
value, ok := p[key]
|
|
||||||
if !ok {
|
|
||||||
return 0, ErrParamNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
float32Value, ok := value.(float32)
|
|
||||||
if ok {
|
|
||||||
return float32Value, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
float64Value, ok := value.(float64)
|
|
||||||
if ok {
|
|
||||||
return float32(float64Value), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
intValue, ok := value.(int)
|
|
||||||
if ok {
|
|
||||||
return float32(intValue), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
uintValue, ok := value.(uint)
|
|
||||||
if ok {
|
|
||||||
return float32(uintValue), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
byteValue, ok := value.(byte)
|
|
||||||
if ok {
|
|
||||||
return float32(byteValue), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0, ErrParamNotNumber
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p Params) GetFloat64(key string) (float64, error) {
|
|
||||||
value, ok := p[key]
|
|
||||||
if !ok {
|
|
||||||
return 0, ErrParamNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
float64Value, ok := value.(float64)
|
|
||||||
if ok {
|
|
||||||
return float64Value, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
float32Value, ok := value.(float32)
|
|
||||||
if ok {
|
|
||||||
return float64(float32Value), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
intValue, ok := value.(int)
|
|
||||||
if ok {
|
|
||||||
return float64(intValue), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
uintValue, ok := value.(uint)
|
|
||||||
if ok {
|
|
||||||
return float64(uintValue), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
byteValue, ok := value.(byte)
|
|
||||||
if ok {
|
|
||||||
return float64(byteValue), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0, ErrParamNotNumber
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p Params) GetBool(key string) (bool, error) {
|
|
||||||
value, ok := p[key]
|
|
||||||
if !ok {
|
|
||||||
return false, ErrParamNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
boolValue, ok := value.(bool)
|
|
||||||
if !ok {
|
|
||||||
return false, ErrParamNotBool
|
|
||||||
}
|
|
||||||
return boolValue, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p Params) GetStringSlice(key string) ([]string, error) {
|
|
||||||
value, ok := p[key]
|
|
||||||
if !ok {
|
|
||||||
return nil, ErrParamNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
interfaceSlice, ok := value.([]any)
|
|
||||||
if !ok {
|
|
||||||
return nil, ErrParamNotSlice
|
|
||||||
}
|
|
||||||
|
|
||||||
stringSlice := make([]string, len(interfaceSlice))
|
|
||||||
for i, v := range interfaceSlice {
|
|
||||||
str, ok := v.(string)
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("element at index %d is not a string", i)
|
|
||||||
}
|
|
||||||
stringSlice[i] = str
|
|
||||||
}
|
|
||||||
return stringSlice, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p Params) GetIntSlice(key string) ([]int, error) {
|
|
||||||
value, ok := p[key]
|
|
||||||
if !ok {
|
|
||||||
return nil, ErrParamNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
v := reflect.ValueOf(value)
|
|
||||||
if v.Kind() != reflect.Slice {
|
|
||||||
return nil, ErrParamNotSlice
|
|
||||||
}
|
|
||||||
|
|
||||||
result := make([]int, v.Len())
|
|
||||||
for i := 0; i < v.Len(); i++ {
|
|
||||||
elem := v.Index(i).Interface()
|
|
||||||
byteValue, ok := elem.(byte)
|
|
||||||
if ok {
|
|
||||||
result[i] = int(byteValue)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
uintValue, ok := elem.(uint)
|
|
||||||
if ok {
|
|
||||||
result[i] = int(uintValue)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
intValue, ok := elem.(int)
|
|
||||||
if ok {
|
|
||||||
result[i] = int(intValue)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
floatValue, ok := elem.(float64)
|
|
||||||
if ok {
|
|
||||||
if floatValue != math.Floor(floatValue) {
|
|
||||||
return nil, fmt.Errorf("element at index %d is not an integer", i)
|
|
||||||
}
|
|
||||||
result[i] = int(floatValue)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("element at index %d is not a number", i)
|
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p Params) GetByteSlice(key string) ([]byte, error) {
|
|
||||||
value, ok := p[key]
|
|
||||||
if !ok {
|
|
||||||
return nil, ErrParamNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
v := reflect.ValueOf(value)
|
|
||||||
if v.Kind() != reflect.Slice {
|
|
||||||
return nil, ErrParamNotSlice
|
|
||||||
}
|
|
||||||
|
|
||||||
result := make([]byte, v.Len())
|
|
||||||
for i := 0; i < v.Len(); i++ {
|
|
||||||
elem := v.Index(i).Interface()
|
|
||||||
byteValue, ok := elem.(byte)
|
|
||||||
if ok {
|
|
||||||
result[i] = byteValue
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
uintValue, ok := elem.(uint)
|
|
||||||
if ok {
|
|
||||||
if uintValue > 255 {
|
|
||||||
return nil, fmt.Errorf("element at index %d is out of byte range", i)
|
|
||||||
}
|
|
||||||
result[i] = byte(uintValue)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
intValue, ok := elem.(int)
|
|
||||||
if ok {
|
|
||||||
if intValue < 0 || intValue > 255 {
|
|
||||||
return nil, fmt.Errorf("element at index %d is out of byte range", i)
|
|
||||||
}
|
|
||||||
result[i] = byte(intValue)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
floatValue, ok := elem.(float64)
|
|
||||||
if ok {
|
|
||||||
if floatValue != math.Floor(floatValue) {
|
|
||||||
return nil, fmt.Errorf("element at index %d is not an integer", i)
|
|
||||||
}
|
|
||||||
if floatValue < 0 || floatValue > 255 {
|
|
||||||
return nil, fmt.Errorf("element at index %d is out of byte range", i)
|
|
||||||
}
|
|
||||||
result[i] = byte(floatValue)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("element at index %d is not a number", i)
|
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type ModuleConfig struct {
|
type ModuleConfig struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
|
|||||||
140
internal/config/params.go
Normal file
140
internal/config/params.go
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Params map[string]any
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrParamNotFound = errors.New("not found")
|
||||||
|
ErrParamNotString = errors.New("not a string")
|
||||||
|
ErrParamNotNumber = errors.New("not a number")
|
||||||
|
ErrParamNotInteger = errors.New("not an integer")
|
||||||
|
ErrParamNotBool = errors.New("not a boolean")
|
||||||
|
ErrParamNotSlice = errors.New("not a slice")
|
||||||
|
ErrParamNotByteSlice = errors.New("not a byte slice")
|
||||||
|
ErrParamNotIntSlice = errors.New("not an int slice")
|
||||||
|
)
|
||||||
|
|
||||||
|
func (p Params) GetString(key string) (string, error) {
|
||||||
|
value, ok := p[key]
|
||||||
|
if !ok {
|
||||||
|
return "", ErrParamNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
stringValue, ok := value.(string)
|
||||||
|
if !ok {
|
||||||
|
return "", ErrParamNotString
|
||||||
|
}
|
||||||
|
return stringValue, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Params) GetInt(key string) (int, error) {
|
||||||
|
value, ok := p[key]
|
||||||
|
if !ok {
|
||||||
|
return 0, ErrParamNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
intValue, ok := common.GetAnyAsInt(value)
|
||||||
|
if ok {
|
||||||
|
return intValue, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, ErrParamNotNumber
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Params) GetFloat32(key string) (float32, error) {
|
||||||
|
value, ok := p[key]
|
||||||
|
if !ok {
|
||||||
|
return 0, ErrParamNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
floatValue, ok := common.GetAnyAsFloat32(value)
|
||||||
|
if ok {
|
||||||
|
return floatValue, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, ErrParamNotNumber
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Params) GetFloat64(key string) (float64, error) {
|
||||||
|
value, ok := p[key]
|
||||||
|
if !ok {
|
||||||
|
return 0, ErrParamNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
floatValue, ok := common.GetAnyAsFloat64(value)
|
||||||
|
if ok {
|
||||||
|
return floatValue, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, ErrParamNotNumber
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Params) GetBool(key string) (bool, error) {
|
||||||
|
value, ok := p[key]
|
||||||
|
if !ok {
|
||||||
|
return false, ErrParamNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
boolValue, ok := value.(bool)
|
||||||
|
if !ok {
|
||||||
|
return false, ErrParamNotBool
|
||||||
|
}
|
||||||
|
return boolValue, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Params) GetStringSlice(key string) ([]string, error) {
|
||||||
|
value, ok := p[key]
|
||||||
|
if !ok {
|
||||||
|
return nil, ErrParamNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
interfaceSlice, ok := value.([]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, ErrParamNotSlice
|
||||||
|
}
|
||||||
|
|
||||||
|
stringSlice := make([]string, len(interfaceSlice))
|
||||||
|
for i, v := range interfaceSlice {
|
||||||
|
str, ok := v.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("element at index %d is not a string", i)
|
||||||
|
}
|
||||||
|
stringSlice[i] = str
|
||||||
|
}
|
||||||
|
return stringSlice, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Params) GetIntSlice(key string) ([]int, error) {
|
||||||
|
value, ok := p[key]
|
||||||
|
if !ok {
|
||||||
|
return nil, ErrParamNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
intSlice, ok := common.GetAnyAsIntSlice(value)
|
||||||
|
if !ok {
|
||||||
|
return nil, ErrParamNotIntSlice
|
||||||
|
}
|
||||||
|
|
||||||
|
return intSlice, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Params) GetByteSlice(key string) ([]byte, error) {
|
||||||
|
value, ok := p[key]
|
||||||
|
if !ok {
|
||||||
|
return nil, ErrParamNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
byteSlice, ok := common.GetAnyAsByteSlice(value)
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
return nil, ErrParamNotByteSlice
|
||||||
|
}
|
||||||
|
|
||||||
|
return byteSlice, nil
|
||||||
|
}
|
||||||
@@ -187,7 +187,7 @@ func (hs *HTTPServer) Output(ctx context.Context, payload any) error {
|
|||||||
return errors.New("http.server output must originate from an http.server input")
|
return errors.New("http.server output must originate from an http.server input")
|
||||||
}
|
}
|
||||||
|
|
||||||
payloadResponse, ok := processor.GetAnyAs[processor.HTTPResponse](payload)
|
payloadResponse, ok := common.GetAnyAs[processor.HTTPResponse](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("http.server is only able to output HTTPResponse")
|
return errors.New("http.server is only able to output HTTPResponse")
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import (
|
|||||||
|
|
||||||
"github.com/jwetzell/showbridge-go/internal/common"
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"github.com/jwetzell/showbridge-go/internal/processor"
|
|
||||||
"gitlab.com/gomidi/midi/v2"
|
"gitlab.com/gomidi/midi/v2"
|
||||||
_ "gitlab.com/gomidi/midi/v2/drivers/rtmididrv"
|
_ "gitlab.com/gomidi/midi/v2/drivers/rtmididrv"
|
||||||
)
|
)
|
||||||
@@ -85,7 +84,7 @@ func (mo *MIDIOutput) Output(ctx context.Context, payload any) error {
|
|||||||
return errors.New("midi.output output is not setup")
|
return errors.New("midi.output output is not setup")
|
||||||
}
|
}
|
||||||
|
|
||||||
payloadMessage, ok := processor.GetAnyAs[midi.Message](payload)
|
payloadMessage, ok := common.GetAnyAs[midi.Message](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("midi.output can only ouptut midi.Message")
|
return errors.New("midi.output can only ouptut midi.Message")
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
mqtt "github.com/eclipse/paho.mqtt.golang"
|
mqtt "github.com/eclipse/paho.mqtt.golang"
|
||||||
"github.com/jwetzell/showbridge-go/internal/common"
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"github.com/jwetzell/showbridge-go/internal/processor"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type MQTTClient struct {
|
type MQTTClient struct {
|
||||||
@@ -102,7 +101,7 @@ func (mc *MQTTClient) Start(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mc *MQTTClient) Output(ctx context.Context, payload any) error {
|
func (mc *MQTTClient) Output(ctx context.Context, payload any) error {
|
||||||
payloadMessage, ok := processor.GetAnyAs[mqtt.Message](payload)
|
payloadMessage, ok := common.GetAnyAs[mqtt.Message](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("mqtt.client is only able to output a MQTTMessage")
|
return errors.New("mqtt.client is only able to output a MQTTMessage")
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ func (nc *NATSClient) Start(ctx context.Context) error {
|
|||||||
|
|
||||||
func (nc *NATSClient) Output(ctx context.Context, payload any) error {
|
func (nc *NATSClient) Output(ctx context.Context, payload any) error {
|
||||||
|
|
||||||
payloadMessage, ok := processor.GetAnyAs[processor.NATSMessage](payload)
|
payloadMessage, ok := common.GetAnyAs[processor.NATSMessage](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("nats.client is only able to output NATSMessage")
|
return errors.New("nats.client is only able to output NATSMessage")
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import (
|
|||||||
"github.com/jwetzell/showbridge-go/internal/common"
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"github.com/jwetzell/showbridge-go/internal/framer"
|
"github.com/jwetzell/showbridge-go/internal/framer"
|
||||||
"github.com/jwetzell/showbridge-go/internal/processor"
|
|
||||||
"go.bug.st/serial"
|
"go.bug.st/serial"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -157,7 +156,7 @@ func (sc *SerialClient) Start(ctx context.Context) error {
|
|||||||
|
|
||||||
func (sc *SerialClient) Output(ctx context.Context, payload any) error {
|
func (sc *SerialClient) Output(ctx context.Context, payload any) error {
|
||||||
|
|
||||||
payloadBytes, ok := processor.GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("serial.client can only ouptut bytes")
|
return errors.New("serial.client can only ouptut bytes")
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ func (scs *SIPCallServer) Output(ctx context.Context, payload any) error {
|
|||||||
return errors.New("sip.call.server inDialog already ended")
|
return errors.New("sip.call.server inDialog already ended")
|
||||||
}
|
}
|
||||||
|
|
||||||
payloadDTMFResponse, ok := processor.GetAnyAs[processor.SipDTMFResponse](payload)
|
payloadDTMFResponse, ok := common.GetAnyAs[processor.SipDTMFResponse](payload)
|
||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
dtmfWriter := call.inDialog.AudioWriterDTMF()
|
dtmfWriter := call.inDialog.AudioWriterDTMF()
|
||||||
@@ -189,7 +189,7 @@ func (scs *SIPCallServer) Output(ctx context.Context, payload any) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
payloadAudioFileResponse, ok := processor.GetAnyAs[processor.SipAudioFileResponse](payload)
|
payloadAudioFileResponse, ok := common.GetAnyAs[processor.SipAudioFileResponse](payload)
|
||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
audioFile, err := os.Open(payloadAudioFileResponse.AudioFile)
|
audioFile, err := os.Open(payloadAudioFileResponse.AudioFile)
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ func (sds *SIPDTMFServer) Output(ctx context.Context, payload any) error {
|
|||||||
return errors.New("sip.dtmf.server inDialog already ended")
|
return errors.New("sip.dtmf.server inDialog already ended")
|
||||||
}
|
}
|
||||||
|
|
||||||
payloadDTMFResponse, ok := processor.GetAnyAs[processor.SipDTMFResponse](payload)
|
payloadDTMFResponse, ok := common.GetAnyAs[processor.SipDTMFResponse](payload)
|
||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
dtmfWriter := call.inDialog.AudioWriterDTMF()
|
dtmfWriter := call.inDialog.AudioWriterDTMF()
|
||||||
@@ -216,7 +216,7 @@ func (sds *SIPDTMFServer) Output(ctx context.Context, payload any) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
payloadAudioFileResponse, ok := processor.GetAnyAs[processor.SipAudioFileResponse](payload)
|
payloadAudioFileResponse, ok := common.GetAnyAs[processor.SipAudioFileResponse](payload)
|
||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
audioFile, err := os.Open(payloadAudioFileResponse.AudioFile)
|
audioFile, err := os.Open(payloadAudioFileResponse.AudioFile)
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import (
|
|||||||
"github.com/jwetzell/showbridge-go/internal/common"
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"github.com/jwetzell/showbridge-go/internal/framer"
|
"github.com/jwetzell/showbridge-go/internal/framer"
|
||||||
"github.com/jwetzell/showbridge-go/internal/processor"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type TCPClient struct {
|
type TCPClient struct {
|
||||||
@@ -153,7 +152,7 @@ func (tc *TCPClient) Output(ctx context.Context, payload any) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
payloadBytes, ok := processor.GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("net.tcp.client is only able to output bytes")
|
return errors.New("net.tcp.client is only able to output bytes")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import (
|
|||||||
"github.com/jwetzell/showbridge-go/internal/common"
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"github.com/jwetzell/showbridge-go/internal/framer"
|
"github.com/jwetzell/showbridge-go/internal/framer"
|
||||||
"github.com/jwetzell/showbridge-go/internal/processor"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type TCPServer struct {
|
type TCPServer struct {
|
||||||
@@ -207,7 +206,7 @@ AcceptLoop:
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ts *TCPServer) Output(ctx context.Context, payload any) error {
|
func (ts *TCPServer) Output(ctx context.Context, payload any) error {
|
||||||
payloadBytes, ok := processor.GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("net.tcp.server is only able to output bytes")
|
return errors.New("net.tcp.server is only able to output bytes")
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
|
|
||||||
"github.com/jwetzell/showbridge-go/internal/common"
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"github.com/jwetzell/showbridge-go/internal/processor"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type UDPClient struct {
|
type UDPClient struct {
|
||||||
@@ -88,7 +87,7 @@ func (uc *UDPClient) Start(ctx context.Context) error {
|
|||||||
|
|
||||||
func (uc *UDPClient) Output(ctx context.Context, payload any) error {
|
func (uc *UDPClient) Output(ctx context.Context, payload any) error {
|
||||||
|
|
||||||
payloadBytes, ok := processor.GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("net.udp.client is only able to output bytes")
|
return errors.New("net.udp.client is only able to output bytes")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import (
|
|||||||
|
|
||||||
"github.com/jwetzell/showbridge-go/internal/common"
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"github.com/jwetzell/showbridge-go/internal/processor"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type UDPMulticast struct {
|
type UDPMulticast struct {
|
||||||
@@ -109,7 +108,7 @@ func (um *UDPMulticast) Start(ctx context.Context) error {
|
|||||||
|
|
||||||
func (um *UDPMulticast) Output(ctx context.Context, payload any) error {
|
func (um *UDPMulticast) Output(ctx context.Context, payload any) error {
|
||||||
|
|
||||||
payloadBytes, ok := processor.GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("net.udp.multicast can only output bytes")
|
return errors.New("net.udp.multicast can only output bytes")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/jwetzell/artnet-go"
|
"github.com/jwetzell/artnet-go"
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,7 +14,7 @@ type ArtNetPacketDecode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (apd *ArtNetPacketDecode) Process(ctx context.Context, payload any) (any, error) {
|
func (apd *ArtNetPacketDecode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadBytes, ok := GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("artnet.packet.decode processor only accepts a []byte")
|
return nil, fmt.Errorf("artnet.packet.decode processor only accepts a []byte")
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/jwetzell/artnet-go"
|
"github.com/jwetzell/artnet-go"
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,7 +14,7 @@ type ArtNetPacketEncode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ape *ArtNetPacketEncode) Process(ctx context.Context, payload any) (any, error) {
|
func (ape *ArtNetPacketEncode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadPacket, ok := GetAnyAs[artnet.ArtNetPacket](payload)
|
payloadPacket, ok := common.GetAnyAs[artnet.ArtNetPacket](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("artnet.packet.encode processor only accepts an ArtNetPacket")
|
return nil, fmt.Errorf("artnet.packet.encode processor only accepts an ArtNetPacket")
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,7 +16,7 @@ type FilterRegex struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fr *FilterRegex) Process(ctx context.Context, payload any) (any, error) {
|
func (fr *FilterRegex) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadString, ok := GetAnyAs[string](payload)
|
payloadString, ok := common.GetAnyAs[string](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("filter.regex processor only accepts a string")
|
return nil, errors.New("filter.regex processor only accepts a string")
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,7 +16,7 @@ type FloatParse struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fp *FloatParse) Process(ctx context.Context, payload any) (any, error) {
|
func (fp *FloatParse) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadString, ok := GetAnyAs[string](payload)
|
payloadString, ok := common.GetAnyAs[string](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("float.parse processor only accepts a string")
|
return nil, errors.New("float.parse processor only accepts a string")
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
freeD "github.com/jwetzell/free-d-go"
|
freeD "github.com/jwetzell/free-d-go"
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,7 +14,7 @@ type FreeDDecode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fd *FreeDDecode) Process(ctx context.Context, payload any) (any, error) {
|
func (fd *FreeDDecode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadBytes, ok := GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("freed.decode processor only accepts a []byte")
|
return nil, errors.New("freed.decode processor only accepts a []byte")
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
freeD "github.com/jwetzell/free-d-go"
|
freeD "github.com/jwetzell/free-d-go"
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,7 +14,7 @@ type FreeDEncode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fe *FreeDEncode) Process(ctx context.Context, payload any) (any, error) {
|
func (fe *FreeDEncode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadPosition, ok := GetAnyAs[freeD.FreeDPosition](payload)
|
payloadPosition, ok := common.GetAnyAs[freeD.FreeDPosition](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("freed.decode processor only accepts a FreeDEncode")
|
return nil, errors.New("freed.decode processor only accepts a FreeDEncode")
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -16,7 +17,7 @@ type IntParse struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ip *IntParse) Process(ctx context.Context, payload any) (any, error) {
|
func (ip *IntParse) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadString, ok := GetAnyAs[string](payload)
|
payloadString, ok := common.GetAnyAs[string](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("int.parse processor only accepts a string")
|
return nil, errors.New("int.parse processor only accepts a string")
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -17,7 +18,7 @@ type IntScale struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ir *IntScale) Process(ctx context.Context, payload any) (any, error) {
|
func (ir *IntScale) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadInt, ok := GetAnyAs[int](payload)
|
payloadInt, ok := common.GetAnyAs[int](payload)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("int.scale can only process an int")
|
return nil, errors.New("int.scale can only process an int")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -14,10 +15,10 @@ type JsonDecode struct {
|
|||||||
|
|
||||||
func (jd *JsonDecode) Process(ctx context.Context, payload any) (any, error) {
|
func (jd *JsonDecode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
|
|
||||||
payloadBytes, ok := GetAnyAsByteSlice(payload)
|
payloadBytes, ok := common.GetAnyAsByteSlice(payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
payloadString, ok := GetAnyAs[string](payload)
|
payloadString, ok := common.GetAnyAs[string](payload)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("json.decode can only process a string or []byte")
|
return nil, errors.New("json.decode can only process a string or []byte")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"gitlab.com/gomidi/midi/v2"
|
"gitlab.com/gomidi/midi/v2"
|
||||||
)
|
)
|
||||||
@@ -15,7 +16,7 @@ type MIDIMessageDecode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mmd *MIDIMessageDecode) Process(ctx context.Context, payload any) (any, error) {
|
func (mmd *MIDIMessageDecode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadBytes, ok := GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("midi.message.decode processor only accepts a []byte")
|
return nil, errors.New("midi.message.decode processor only accepts a []byte")
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"gitlab.com/gomidi/midi/v2"
|
"gitlab.com/gomidi/midi/v2"
|
||||||
)
|
)
|
||||||
@@ -15,7 +16,7 @@ type MIDIMessageEncode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mme *MIDIMessageEncode) Process(ctx context.Context, payload any) (any, error) {
|
func (mme *MIDIMessageEncode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadMessage, ok := GetAnyAs[midi.Message](payload)
|
payloadMessage, ok := common.GetAnyAs[midi.Message](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("midi.message.encode processor only accepts a midi.Message")
|
return nil, errors.New("midi.message.encode processor only accepts a midi.Message")
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"gitlab.com/gomidi/midi/v2"
|
"gitlab.com/gomidi/midi/v2"
|
||||||
)
|
)
|
||||||
@@ -45,7 +46,7 @@ type MIDIPitchBend struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mmu *MIDIMessageUnpack) Process(ctx context.Context, payload any) (any, error) {
|
func (mmu *MIDIMessageUnpack) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadMidi, ok := GetAnyAs[midi.Message](payload)
|
payloadMidi, ok := common.GetAnyAs[midi.Message](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("midi.message.unpack processor only accepts a midi.Message")
|
return nil, errors.New("midi.message.unpack processor only accepts a midi.Message")
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
mqtt "github.com/eclipse/paho.mqtt.golang"
|
mqtt "github.com/eclipse/paho.mqtt.golang"
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,7 +14,7 @@ type MQTTMessageEncode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mme *MQTTMessageEncode) Process(ctx context.Context, payload any) (any, error) {
|
func (mme *MQTTMessageEncode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadMessage, ok := GetAnyAs[mqtt.Message](payload)
|
payloadMessage, ok := common.GetAnyAs[mqtt.Message](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("mqtt.message.encode processor only accepts an mqtt.Message")
|
return nil, errors.New("mqtt.message.encode processor only accepts an mqtt.Message")
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
osc "github.com/jwetzell/osc-go"
|
osc "github.com/jwetzell/osc-go"
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -14,7 +15,7 @@ type OSCMessageDecode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (omd *OSCMessageDecode) Process(ctx context.Context, payload any) (any, error) {
|
func (omd *OSCMessageDecode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadBytes, ok := GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("osc.message.decode processor only accepts a []byte payload")
|
return nil, errors.New("osc.message.decode processor only accepts a []byte payload")
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
osc "github.com/jwetzell/osc-go"
|
osc "github.com/jwetzell/osc-go"
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,7 +14,7 @@ type OSCMessageEncode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ome *OSCMessageEncode) Process(ctx context.Context, payload any) (any, error) {
|
func (ome *OSCMessageEncode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadMessage, ok := GetAnyAs[*osc.OSCMessage](payload)
|
payloadMessage, ok := common.GetAnyAs[*osc.OSCMessage](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("osc.message.encode processor only accepts an *OSCMessage")
|
return nil, errors.New("osc.message.encode processor only accepts an *OSCMessage")
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package processor
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
|
||||||
"reflect"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/jwetzell/showbridge-go/internal/common"
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
@@ -44,57 +42,6 @@ var (
|
|||||||
ProcessorRegistry = make(map[string]ProcessorRegistration)
|
ProcessorRegistry = make(map[string]ProcessorRegistration)
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetAnyAs[T any](p any) (T, bool) {
|
|
||||||
typed, ok := p.(T)
|
|
||||||
return typed, ok
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAnyAsByteSlice(p any) ([]byte, bool) {
|
|
||||||
v := reflect.ValueOf(p)
|
|
||||||
if v.Kind() != reflect.Slice {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
result := make([]byte, v.Len())
|
|
||||||
for i := 0; i < v.Len(); i++ {
|
|
||||||
elem := v.Index(i).Interface()
|
|
||||||
byteValue, ok := elem.(byte)
|
|
||||||
if ok {
|
|
||||||
result[i] = byteValue
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
uintValue, ok := elem.(uint)
|
|
||||||
if ok {
|
|
||||||
if uintValue > 255 {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
result[i] = byte(uintValue)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
intValue, ok := elem.(int)
|
|
||||||
if ok {
|
|
||||||
if intValue < 0 || intValue > 255 {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
result[i] = byte(intValue)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
floatValue, ok := elem.(float64)
|
|
||||||
if ok {
|
|
||||||
if floatValue != math.Floor(floatValue) {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
if floatValue < 0 || floatValue > 255 {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
result[i] = byte(floatValue)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
return result, true
|
|
||||||
}
|
|
||||||
|
|
||||||
type TemplateData struct {
|
type TemplateData struct {
|
||||||
Payload any
|
Payload any
|
||||||
Modules any
|
Modules any
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
extism "github.com/extism/go-sdk"
|
extism "github.com/extism/go-sdk"
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -17,7 +18,7 @@ type ScriptWASM struct {
|
|||||||
|
|
||||||
func (sw *ScriptWASM) Process(ctx context.Context, payload any) (any, error) {
|
func (sw *ScriptWASM) Process(ctx context.Context, payload any) (any, error) {
|
||||||
|
|
||||||
payloadBytes, ok := GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("script.wasm can only process a byte array")
|
return nil, fmt.Errorf("script.wasm can only process a byte array")
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,7 +13,7 @@ type StringDecode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (sd *StringDecode) Process(ctx context.Context, payload any) (any, error) {
|
func (sd *StringDecode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadBytes, ok := GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("string.decode processor only accepts a []byte")
|
return nil, errors.New("string.decode processor only accepts a []byte")
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,7 +13,7 @@ type StringEncode struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (se *StringEncode) Process(ctx context.Context, payload any) (any, error) {
|
func (se *StringEncode) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadString, ok := GetAnyAs[string](payload)
|
payloadString, ok := common.GetAnyAs[string](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("string.encode processor only accepts a string")
|
return nil, errors.New("string.encode processor only accepts a string")
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,7 +16,7 @@ type StringSplit struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ss *StringSplit) Process(ctx context.Context, payload any) (any, error) {
|
func (ss *StringSplit) Process(ctx context.Context, payload any) (any, error) {
|
||||||
payloadString, ok := GetAnyAs[string](payload)
|
payloadString, ok := common.GetAnyAs[string](payload)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("string.split only accepts a string")
|
return nil, errors.New("string.split only accepts a string")
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ func TestBadMQTTMessageCreate(t *testing.T) {
|
|||||||
"payload": 123,
|
"payload": 123,
|
||||||
},
|
},
|
||||||
payload: 1,
|
payload: 1,
|
||||||
errorString: "mqtt.message.create payload error: not a slice",
|
errorString: "mqtt.message.create payload error: not a byte slice",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
|
|
||||||
"github.com/jwetzell/showbridge-go/internal/common"
|
"github.com/jwetzell/showbridge-go/internal/common"
|
||||||
"github.com/jwetzell/showbridge-go/internal/config"
|
"github.com/jwetzell/showbridge-go/internal/config"
|
||||||
"github.com/jwetzell/showbridge-go/internal/processor"
|
|
||||||
"github.com/jwetzell/showbridge-go/internal/route"
|
"github.com/jwetzell/showbridge-go/internal/route"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -61,7 +60,7 @@ func TestGoodRouteHandleInput(t *testing.T) {
|
|||||||
t.Fatalf("route ProcessPayload returned error: %v", err)
|
t.Fatalf("route ProcessPayload returned error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
payloadBytes, ok := processor.GetAnyAs[[]byte](payload)
|
payloadBytes, ok := common.GetAnyAs[[]byte](payload)
|
||||||
if !ok {
|
if !ok {
|
||||||
t.Fatalf("payload should be []byte got %T", payload)
|
t.Fatalf("payload should be []byte got %T", payload)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user