fix(app,manifest): manifest serialization
All checks were successful
arcad/edge/pipeline/head This commit looks good
All checks were successful
arcad/edge/pipeline/head This commit looks good
This commit is contained in:
@ -12,12 +12,12 @@ import (
|
||||
type ID string
|
||||
|
||||
type Manifest struct {
|
||||
ID ID `yaml:"id" json:"id"`
|
||||
Version string `yaml:"version" json:"version"`
|
||||
Title string `yaml:"title" json:"title"`
|
||||
Description string `yaml:"description" json:"description"`
|
||||
Tags []string `yaml:"tags" json:"tags"`
|
||||
Metadata map[string]any `yaml:"metadata" json:"metadata"`
|
||||
ID ID `yaml:"id" json:"id"`
|
||||
Version string `yaml:"version" json:"version"`
|
||||
Title string `yaml:"title" json:"title"`
|
||||
Description string `yaml:"description" json:"description"`
|
||||
Tags []string `yaml:"tags" json:"tags"`
|
||||
Metadata MapStr `yaml:"metadata" json:"metadata"`
|
||||
}
|
||||
|
||||
type MetadataValidator func(map[string]any) (bool, error)
|
||||
|
61
pkg/app/map_str.go
Normal file
61
pkg/app/map_str.go
Normal file
@ -0,0 +1,61 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type MapStr map[string]interface{}
|
||||
|
||||
func MapStrUnion(dict1 MapStr, dict2 MapStr) MapStr {
|
||||
dict := MapStr{}
|
||||
|
||||
for k, v := range dict1 {
|
||||
dict[k] = v
|
||||
}
|
||||
|
||||
for k, v := range dict2 {
|
||||
dict[k] = v
|
||||
}
|
||||
return dict
|
||||
}
|
||||
|
||||
func (ms *MapStr) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||
var result map[interface{}]interface{}
|
||||
err := unmarshal(&result)
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
*ms = cleanUpInterfaceMap(result)
|
||||
return nil
|
||||
}
|
||||
|
||||
func cleanUpInterfaceArray(in []interface{}) []interface{} {
|
||||
result := make([]interface{}, len(in))
|
||||
for i, v := range in {
|
||||
result[i] = cleanUpMapValue(v)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func cleanUpInterfaceMap(in map[interface{}]interface{}) MapStr {
|
||||
result := make(MapStr)
|
||||
for k, v := range in {
|
||||
result[fmt.Sprintf("%v", k)] = cleanUpMapValue(v)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func cleanUpMapValue(v interface{}) interface{} {
|
||||
switch v := v.(type) {
|
||||
case []interface{}:
|
||||
return cleanUpInterfaceArray(v)
|
||||
case map[interface{}]interface{}:
|
||||
return cleanUpInterfaceMap(v)
|
||||
case string:
|
||||
return v
|
||||
default:
|
||||
return fmt.Sprintf("%v", v)
|
||||
}
|
||||
}
|
@ -26,28 +26,23 @@ func WithNamedPathsValidator(names ...NamedPath) app.MetadataValidator {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
paths, ok := rawPaths.(map[any]any)
|
||||
paths, ok := rawPaths.(app.MapStr)
|
||||
if !ok {
|
||||
return false, errors.Errorf("metadata['paths']: unexpected named path value type '%T'", rawPaths)
|
||||
}
|
||||
|
||||
for n, p := range paths {
|
||||
name, ok := n.(string)
|
||||
if !ok {
|
||||
return false, errors.Errorf("metadata['paths']: unexpected named path type '%T'", n)
|
||||
}
|
||||
|
||||
if _, exists := set[NamedPath(name)]; !exists {
|
||||
return false, errors.Errorf("metadata['paths']: unexpected named path '%s'", name)
|
||||
if _, exists := set[NamedPath(n)]; !exists {
|
||||
return false, errors.Errorf("metadata['paths']: unexpected named path '%s'", n)
|
||||
}
|
||||
|
||||
path, ok := p.(string)
|
||||
if !ok {
|
||||
return false, errors.Errorf("metadata['paths']['%s']: unexpected named path value type '%T'", name, path)
|
||||
return false, errors.Errorf("metadata['paths']['%s']: unexpected named path value type '%T'", n, path)
|
||||
}
|
||||
|
||||
if !strings.HasPrefix(path, "/") {
|
||||
return false, errors.Errorf("metadata['paths']['%s']: named path value should start with a '/'", name)
|
||||
return false, errors.Errorf("metadata['paths']['%s']: named path value should start with a '/'", n)
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user