goap/parser.go
2024-08-26 17:17:08 +02:00

94 lines
2 KiB
Go

package goap
import "slices"
var allInternalParsersExceptBase []UnmarshalFunc = []UnmarshalFunc{
ParseASActorData,
ParseASAlsoKnownAsData,
ParseASAttachmentsData,
ParseASAttributedToData,
ParseASCCData,
ParseASContentData,
ParseASEndpointsData,
ParseASFollowersData,
ParseASFollowingData,
ParseASHrefData,
ParseASIconData,
ParseASImageData,
ParseASMediaTypeData,
ParseASNameData,
ParseASOutboxData,
ParseASObjectData,
ParseASPreferredNameData,
ParseASPublishedData,
ParseASRestrictedData,
ParseASRepliesData,
ParseASSharedInboxData,
ParseASSummaryData,
ParseASSensitiveData,
ParseASTagData,
ParseASToData,
ParseASUrlData,
ParseASUpdatedData,
ParseOstatusAtomUriData,
ParseOstatusConversationData,
ParseW3InboxData,
ParseW3VcardAddressData,
ParseW3VcardBirthdayData,
ParseW3SecurityOwnerData,
ParseW3SecurityPublicKeyPemData,
ParseW3SecurityPublicKeyData,
ParseMastoDevicesData,
ParseMastoDiscoverableData,
ParseMastoFeaturedData,
ParseMastoDiscoverableData,
ParseMastoIndexableData,
ParseMastoMemorialData,
ParseSchemaValueData,
ParseMKIsCatData,
ParseMKSummaryData,
ParseFFSpeakAsCatData,
}
func chainParse(
raw map[string]any,
start BaseApChain,
parsers ...UnmarshalFunc,
) (BaseApChain, []error) {
var current BaseApChain = start
errors := []error{}
for _, p := range parsers {
next, err := p(raw, current)
current = next
errors = append(errors, err)
}
return current, errors
}
func ParseEmptyBase(raw map[string]any, extraParsers ...UnmarshalFunc) (BaseApChain, []error) {
base := EmptyBaseObject{}
allParsers := slices.Clone(allInternalParsersExceptBase)
allParsers = append(allParsers, 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)
}