Meow
- No more BaseObject with Id and Type included, moved those into the nsUndefined namespace - Refactored the full parser funcs into two slightly distinct ones: - One that takes in raw bytes and one that takes in a map[string]any
This commit is contained in:
parent
33a82e544b
commit
2f74543ca1
4 changed files with 107 additions and 68 deletions
|
@ -16,48 +16,6 @@ type BaseApChain interface {
|
|||
// It is expected that, on success, the function removes its key from the raw map
|
||||
type UnmarshalFunc func(map[string]any, BaseApChain) (BaseApChain, error)
|
||||
|
||||
// The minimum data every AP object has
|
||||
type BaseObject struct {
|
||||
Id string
|
||||
Type string
|
||||
}
|
||||
|
||||
func (b *BaseObject) GetSelfOrBase() (BaseApChain, bool) {
|
||||
return b, false
|
||||
}
|
||||
|
||||
func (b *BaseObject) MarshalToMap() map[string]any {
|
||||
return map[string]any{
|
||||
KEY_ID: b.Id,
|
||||
KEY_TYPE: b.Type,
|
||||
}
|
||||
}
|
||||
|
||||
func UnmarshalBaseObject(raw map[string]any, _ BaseApChain) (BaseApChain, error) {
|
||||
rawId, ok := raw[KEY_ID]
|
||||
if !ok {
|
||||
return nil, NoRequiredFieldError{KEY_ID}
|
||||
}
|
||||
id, ok := rawId.(string)
|
||||
if !ok {
|
||||
return nil, BadFieldValueError[string]{KEY_ID, rawId, ""}
|
||||
}
|
||||
|
||||
rawObjType, ok := raw[KEY_TYPE]
|
||||
if !ok {
|
||||
return nil, NoRequiredFieldError{KEY_TYPE}
|
||||
}
|
||||
objType, ok := rawObjType.([]string)
|
||||
if !ok {
|
||||
return nil, BadFieldValueError[[]string]{KEY_TYPE, rawObjType, []string{}}
|
||||
}
|
||||
|
||||
return &BaseObject{
|
||||
Id: id,
|
||||
Type: objType[0],
|
||||
}, nil
|
||||
}
|
||||
|
||||
type EmptyBaseObject struct{}
|
||||
|
||||
func (e *EmptyBaseObject) GetSelfOrBase() (BaseApChain, bool) {
|
||||
|
|
|
@ -515,23 +515,29 @@ func ParseASOutboxData(raw map[string]any, next BaseApChain) (BaseApChain, error
|
|||
}
|
||||
|
||||
type ASObjectData struct {
|
||||
FullIdType
|
||||
Next BaseApChain
|
||||
// Unparsed objects. Please parse yourself. Go doesn't like the recursion if the parser for this attribute was calling Unmarshal
|
||||
Objects []map[string]any
|
||||
}
|
||||
|
||||
func (object *ASObjectData) GetSelfOrBase() (BaseApChain, bool) {
|
||||
return object.FullIdType.Next, true
|
||||
return object.Next, true
|
||||
}
|
||||
|
||||
func (object *ASObjectData) MarshalToMap() map[string]any {
|
||||
return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_OBJECT)
|
||||
return appendWithKey(object.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_OBJECT, object.Objects)
|
||||
}
|
||||
|
||||
func ParseASObjectData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||
id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_OBJECT)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
rawData1, ok := raw[KEY_ACTIVITYSTREAMS_OBJECT]
|
||||
if !ok {
|
||||
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_OBJECT}
|
||||
}
|
||||
return &ASObjectData{FullIdType: *id}, nil
|
||||
data, ok := rawData1.([]map[string]any)
|
||||
if !ok {
|
||||
return nil, BadFieldValueError[[]map[string]any]{KEY_ACTIVITYSTREAMS_OBJECT, rawData1, data}
|
||||
}
|
||||
return &ASObjectData{Next: next, Objects: data}, nil
|
||||
}
|
||||
|
||||
type ASPreferredNameData struct {
|
||||
|
|
58
nsUndefined.go
Normal file
58
nsUndefined.go
Normal file
|
@ -0,0 +1,58 @@
|
|||
package goap
|
||||
|
||||
type UDIdData struct {
|
||||
Next BaseApChain
|
||||
Id string
|
||||
}
|
||||
|
||||
func (u *UDIdData) GetSelfOrBase() (BaseApChain, bool) {
|
||||
return u.Next, true
|
||||
}
|
||||
|
||||
func (b *UDIdData) MarshalToMap() map[string]any {
|
||||
return appendWithKey(b.Next.MarshalToMap(), "KEY_ID", b.Id)
|
||||
}
|
||||
|
||||
func ParseUDIdData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||
rawId, ok := raw[KEY_ID]
|
||||
if !ok {
|
||||
return nil, NoRequiredFieldError{KEY_ID}
|
||||
}
|
||||
id, ok := rawId.(string)
|
||||
if !ok {
|
||||
return nil, BadFieldValueError[string]{KEY_ID, rawId, ""}
|
||||
}
|
||||
delete(raw, KEY_ID)
|
||||
return &UDIdData{
|
||||
Next: next,
|
||||
Id: id,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type UDTypeData struct {
|
||||
Next BaseApChain
|
||||
Type string
|
||||
}
|
||||
|
||||
func (u *UDTypeData) GetSelfOrBase() (BaseApChain, bool) {
|
||||
return u.Next, true
|
||||
}
|
||||
|
||||
func (u *UDTypeData) MarshalToMap() map[string]any {
|
||||
return appendWithKey(u.Next.MarshalToMap(), KEY_TYPE, []any{u.Type})
|
||||
}
|
||||
|
||||
func ParseUDTypeData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||
rawObjType, ok := raw[KEY_TYPE]
|
||||
if !ok {
|
||||
return nil, NoRequiredFieldError{KEY_TYPE}
|
||||
}
|
||||
objType, ok := rawObjType.([]string)
|
||||
if !ok {
|
||||
return nil, BadFieldValueError[[]string]{KEY_TYPE, rawObjType, []string{}}
|
||||
}
|
||||
if len(objType) != 1 {
|
||||
return nil, BadFieldArrayLengthError{KEY_TYPE, 1, len(objType)}
|
||||
}
|
||||
return &UDTypeData{Next: next, Type: objType[0]}, nil
|
||||
}
|
55
parser.go
55
parser.go
|
@ -1,8 +1,15 @@
|
|||
package goap
|
||||
|
||||
import "slices"
|
||||
import (
|
||||
"fmt"
|
||||
"slices"
|
||||
|
||||
"github.com/piprate/json-gold/ld"
|
||||
)
|
||||
|
||||
var allInternalParsersExceptBase []UnmarshalFunc = []UnmarshalFunc{
|
||||
ParseUDIdData,
|
||||
ParseUDTypeData,
|
||||
ParseASActorData,
|
||||
ParseASAlsoKnownAsData,
|
||||
ParseASAttachmentsData,
|
||||
|
@ -75,24 +82,34 @@ func chainParse(
|
|||
return current, errors
|
||||
}
|
||||
|
||||
func ParseEmptyBase(raw map[string]any, extraParsers ...UnmarshalFunc) (BaseApChain, []error) {
|
||||
base := EmptyBaseObject{}
|
||||
func Unmarshal(
|
||||
raw []byte,
|
||||
ldOptions *ld.JsonLdOptions,
|
||||
processor *ld.JsonLdProcessor,
|
||||
extraParsers ...UnmarshalFunc,
|
||||
) (BaseApChain, []error) {
|
||||
if ldOptions == nil {
|
||||
ldOptions = ld.NewJsonLdOptions("")
|
||||
}
|
||||
if processor == nil {
|
||||
processor = ld.NewJsonLdProcessor()
|
||||
}
|
||||
rawData, err := processor.Expand(raw, ldOptions)
|
||||
if err != nil {
|
||||
return nil, []error{err}
|
||||
}
|
||||
data, ok := rawData[0].(map[string]any)
|
||||
if !ok {
|
||||
return nil, []error{fmt.Errorf("failed to cast expand result into map[string]any")}
|
||||
}
|
||||
return UnmarshalPreprocessed(data, extraParsers...)
|
||||
}
|
||||
|
||||
allParsers := slices.Clone(allInternalParsersExceptBase)
|
||||
allParsers = append(allParsers, extraParsers...)
|
||||
func UnmarshalPreprocessed(
|
||||
raw map[string]any,
|
||||
extraParsers ...UnmarshalFunc,
|
||||
) (BaseApChain, []error) {
|
||||
base := EmptyBaseObject{}
|
||||
allParsers := slices.Concat(allInternalParsersExceptBase, extraParsers)
|
||||
return chainParse(raw, &base, allParsers...)
|
||||
}
|
||||
|
||||
func ParseDefaultBase(raw map[string]any, extraParsers ...UnmarshalFunc) (BaseApChain, []error) {
|
||||
base, err := UnmarshalBaseObject(raw, nil)
|
||||
if err != nil {
|
||||
return base, []error{err}
|
||||
}
|
||||
allParsers := slices.Concat(allInternalParsersExceptBase, extraParsers)
|
||||
res, errs := chainParse(raw, base, allParsers...)
|
||||
return res, slices.Insert(errs, 0, err)
|
||||
}
|
||||
|
||||
func MarshalChain(chain BaseApChain) map[string]any {
|
||||
return chain.MarshalToMap()
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue