49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
package format
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"reflect"
|
|
|
|
"github.com/nicholas-fedor/shoutrrr/pkg/types"
|
|
)
|
|
|
|
var ErrNotConfigProp = errors.New("struct field cannot be used as a prop")
|
|
|
|
// GetConfigPropFromString deserializes a config property from a string representation using the ConfigProp interface.
|
|
func GetConfigPropFromString(structType reflect.Type, value string) (reflect.Value, error) {
|
|
valuePtr := reflect.New(structType)
|
|
|
|
configProp, ok := valuePtr.Interface().(types.ConfigProp)
|
|
if !ok {
|
|
return reflect.Value{}, ErrNotConfigProp
|
|
}
|
|
|
|
if err := configProp.SetFromProp(value); err != nil {
|
|
return reflect.Value{}, fmt.Errorf("failed to set config prop from string: %w", err)
|
|
}
|
|
|
|
return valuePtr, nil
|
|
}
|
|
|
|
// GetConfigPropString serializes a config property to a string representation using the ConfigProp interface.
|
|
func GetConfigPropString(propPtr reflect.Value) (string, error) {
|
|
if propPtr.Kind() != reflect.Ptr {
|
|
propVal := propPtr
|
|
propPtr = reflect.New(propVal.Type())
|
|
propPtr.Elem().Set(propVal)
|
|
}
|
|
|
|
if propPtr.CanInterface() {
|
|
if configProp, ok := propPtr.Interface().(types.ConfigProp); ok {
|
|
s, err := configProp.GetPropValue()
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to get config prop string: %w", err)
|
|
}
|
|
|
|
return s, nil
|
|
}
|
|
}
|
|
|
|
return "", ErrNotConfigProp
|
|
}
|