package metadata import ( "strings" "forge.cadoles.com/arcad/edge/pkg/app" "github.com/pkg/errors" ) type NamedPath string const ( NamedPathAdmin NamedPath = "admin" NamedPathIcon NamedPath = "icon" ) func WithNamedPathsValidator(names ...NamedPath) app.MetadataValidator { set := map[NamedPath]struct{}{} for _, n := range names { set[n] = struct{}{} } return func(metadata map[string]any) (bool, error) { rawPaths, exists := metadata["paths"] if !exists { return true, nil } 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 { 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'", n, path) } if !strings.HasPrefix(path, "/") { return false, errors.Errorf("metadata['paths']['%s']: named path value should start with a '/'", n) } } return true, nil } }