package goap import ( "time" xmldatetime "github.com/datainq/xml-date-time" "gitlab.com/mstarongitlab/goutils/sliceutils" ) type ASActorData struct { FullIdType } func (actor *ASActorData) GetSelfOrBase() (BaseApChain, bool) { return actor.FullIdType.GetSelfOrBase() } func (actor *ASActorData) MarshalToMap() map[string]any { return actor.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_ACTOR) } func ParseASActorData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_ACTOR) if err != nil { return nil, err } return &ASActorData{FullIdType: *id}, nil } func AppendASActorData(base BaseApChain, id string) BaseApChain { return &ASActorData{FullIdType{base, id}} } type ASAlsoKnownAsData struct { FullIdType } func (cc *ASAlsoKnownAsData) GetSelfOrBase() (BaseApChain, bool) { return cc.FullIdType.GetSelfOrBase() } func (cc *ASAlsoKnownAsData) MarshalToMap() map[string]any { return cc.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_ALSOKNOWNAS) } func ParseASAlsoKnownAsData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_ALSOKNOWNAS) if err != nil { return nil, err } return &ASAlsoKnownAsData{FullIdType: *id}, nil } func AppendASAlsoKnownAsData(base BaseApChain, id string) BaseApChain { return &ASAlsoKnownAsData{FullIdType{base, id}} } type ASAttachmentsData struct { Next BaseApChain Attachments []Attachment } func (attachmentsdata *ASAttachmentsData) GetSelfOrBase() (BaseApChain, bool) { return attachmentsdata.Next, true } func (attachmentsdata *ASAttachmentsData) MarshalToMap() map[string]any { return appendWithKey( attachmentsdata.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_ATTACHMENTS, sliceutils.Map( attachmentsdata.Attachments, func(t Attachment) map[string]any { return t.Marshal() }, ), ) } func ParseASAttachmentsData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData, ok := raw[KEY_ACTIVITYSTREAMS_ATTACHMENTS] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_ATTACHMENTS} } data, ok := rawData.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{ KEY_ACTIVITYSTREAMS_ATTACHMENTS, rawData, []map[string]any{}, } } attachments := []Attachment{} for _, k := range data { a, err := ParseAttachment(k) if err != nil { return nil, err } attachments = append(attachments, *a) } delete(raw, KEY_ACTIVITYSTREAMS_ATTACHMENTS) return &ASAttachmentsData{ Next: next, Attachments: attachments, }, nil } func AppendASAttachmentsData(base BaseApChain, attachments ...Attachment) BaseApChain { return &ASAttachmentsData{base, attachments} } type ASAttributedToData struct { FullIdType } func (attributedtodata *ASAttributedToData) GetSelfOrBase() (BaseApChain, bool) { return attributedtodata.FullIdType.Next, true } func (attributedtodata *ASAttributedToData) MarshalToMap() map[string]any { return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_ATTRIBUTEDTO) } func ParseASAttributedToData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_ATTRIBUTEDTO) if err != nil { return nil, err } return &ASAttributedToData{FullIdType: *id}, nil } func AppendASAttributedToData(base BaseApChain, id string) BaseApChain { return &ASAttributedToData{FullIdType{base, id}} } type ASCCData struct { Next BaseApChain Targets []string } func (cc *ASCCData) GetSelfOrBase() (BaseApChain, bool) { return cc.Next, true } func (cc *ASCCData) MarshalToMap() map[string]any { return appendWithKey( cc.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_CC, sliceutils.Map(cc.Targets, func(t string) map[string]any { return map[string]any{KEY_ID: t} }), ) } func ParseASCCData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData1, ok := raw[KEY_ACTIVITYSTREAMS_CC] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_CC} } data1, ok := rawData1.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{ KEY_ACTIVITYSTREAMS_CC, rawData1, []map[string]any{}, } } ccs := []string{} for _, v := range data1 { rawVal, ok := v[KEY_ID] if !ok { return nil, NoRequiredSubFieldError{KEY_ACTIVITYSTREAMS_CC, KEY_ID} } val, ok := rawVal.(string) if !ok { return nil, BadFieldValueError[string]{KEY_ID, rawVal, ""} } ccs = append(ccs, val) } delete(raw, KEY_ACTIVITYSTREAMS_CC) return &ASCCData{ Next: next, Targets: ccs, }, nil } func AppendASCCData(base BaseApChain, targets ...string) BaseApChain { return &ASCCData{base, targets} } // Content is an array of string value types due to some servers including the content in multiple languages or with different metadata attached type ASContentData struct { Next BaseApChain Content []ValueValue[string] } func (contentdata *ASContentData) GetSelfOrBase() (BaseApChain, bool) { return contentdata.Next, true } func (contentdata *ASContentData) MarshalToMap() map[string]any { return appendWithKey( contentdata.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_CONTENT, sliceutils.Map(contentdata.Content, func(t ValueValue[string]) map[string]any { return t.Marshal() }), ) } func ParseASContentData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData1, ok := raw[KEY_ACTIVITYSTREAMS_CONTENT] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_CONTENT} } data1, ok := rawData1.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{ KEY_ACTIVITYSTREAMS_CONTENT, rawData1, data1, } } contents := []ValueValue[string]{} for _, v := range data1 { parsed, err := ParseValueValue[string](v) if err != nil { return nil, err } contents = append(contents, *parsed) } delete(raw, KEY_ACTIVITYSTREAMS_CONTENT) return &ASContentData{ Next: next, Content: contents, }, nil } func AppendASContentData(base BaseApChain, entries ...ValueValue[string]) BaseApChain { return &ASContentData{base, entries} } type ASEndpointsData struct { Next BaseApChain Endpoints map[string]string } func (endpointsdata *ASEndpointsData) GetSelfOrBase() (BaseApChain, bool) { return endpointsdata.Next, true } func (endpointsdata *ASEndpointsData) MarshalToMap() map[string]any { m := endpointsdata.Next.MarshalToMap() arr := []map[string]any{} for k, v := range endpointsdata.Endpoints { arr = append(arr, map[string]any{ k: []map[string]any{{KEY_ID: v}}, }) } m[KEY_ACTIVITYSTREAMS_ENDPOINTS] = arr return m } func ParseASEndpointsData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData1, ok := raw[KEY_ACTIVITYSTREAMS_ENDPOINTS] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_ENDPOINTS} } data1, ok := rawData1.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{ KEY_ACTIVITYSTREAMS_ENDPOINTS, rawData1, data1, } } if len(data1) != 1 { return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_ENDPOINTS, 1, len(data1)} } data2 := data1[0] endpoints := map[string]string{} for k, rawV := range data2 { v, ok := rawV.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{k, rawV, v} } if len(v) != 1 { return nil, BadFieldArrayLengthError{k, 1, len(v)} } rawV2, ok := v[0][KEY_ID] if !ok { return nil, NoRequiredSubFieldError{KEY_ACTIVITYSTREAMS_ENDPOINTS, KEY_ID} } v2, ok := rawV2.(string) if !ok { return nil, BadFieldValueError[string]{k, rawV2, ""} } endpoints[k] = v2 } delete(raw, KEY_ACTIVITYSTREAMS_ENDPOINTS) return &ASEndpointsData{ Next: next, Endpoints: endpoints, }, nil } func AppendASEndpointsData(base BaseApChain, endpoints map[string]string) BaseApChain { return &ASEndpointsData{base, endpoints} } type ASFollowersData struct { FullIdType } func (attributedtodata *ASFollowersData) GetSelfOrBase() (BaseApChain, bool) { return attributedtodata.FullIdType.Next, true } func (attributedtodata *ASFollowersData) MarshalToMap() map[string]any { return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_FOLLOWERS) } func ParseASFollowersData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_FOLLOWERS) if err != nil { return nil, err } return &ASFollowersData{FullIdType: *id}, nil } func AppendASFollowersData(base BaseApChain, id string) BaseApChain { return &ASActorData{FullIdType{base, id}} } type ASFollowingData struct { FullIdType } func (attributedtodata *ASFollowingData) GetSelfOrBase() (BaseApChain, bool) { return attributedtodata.FullIdType.Next, true } func (attributedtodata *ASFollowingData) MarshalToMap() map[string]any { return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_FOLLOWING) } func ParseASFollowingData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_FOLLOWING) if err != nil { return nil, err } return &ASFollowingData{FullIdType: *id}, nil } func AppendASFollowingData(base BaseApChain, id string) BaseApChain { return &ASFollowingData{FullIdType{base, id}} } type ASHrefData struct { FullIdType } func (attributedtodata *ASHrefData) GetSelfOrBase() (BaseApChain, bool) { return attributedtodata.FullIdType.Next, true } func (attributedtodata *ASHrefData) MarshalToMap() map[string]any { return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_HREF) } func ParseASHrefData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_HREF) if err != nil { return nil, err } return &ASHrefData{FullIdType: *id}, nil } func AppendASHrefData(base BaseApChain, id string) BaseApChain { return &ASHrefData{FullIdType{base, id}} } type ASIconData struct { Next BaseApChain Media Media } func (icondata *ASIconData) GetSelfOrBase() (BaseApChain, bool) { return icondata.Next, true } func (icondata *ASIconData) MarshalToMap() map[string]any { return appendWithKey( icondata.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_ICON, []map[string]any{icondata.Media.Marshal()}, ) } func ParseASIconData(raw map[string]any, next BaseApChain) (BaseApChain, error) { dataRaw, ok := raw[KEY_ACTIVITYSTREAMS_ICON] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_ICON} } data, ok := dataRaw.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{KEY_ACTIVITYSTREAMS_ICON, dataRaw, data} } if len(data) != 1 { return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_ICON, 1, len(data)} } m, err := ParseMedia(data[0]) if err != nil { return nil, err } delete(raw, KEY_ACTIVITYSTREAMS_ICON) return &ASIconData{ Media: *m, Next: next, }, nil } func AppendASIconData(base BaseApChain, media Media) BaseApChain { return &ASIconData{base, media} } type ASImageData struct { Next BaseApChain Media Media } func (icondata *ASImageData) GetSelfOrBase() (BaseApChain, bool) { return icondata.Next, true } func (icondata *ASImageData) MarshalToMap() map[string]any { return appendWithKey( icondata.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_IMAGE_ATTRIBUTE, []map[string]any{icondata.Media.Marshal()}, ) } func ParseASImageData(raw map[string]any, next BaseApChain) (BaseApChain, error) { dataRaw, ok := raw[KEY_ACTIVITYSTREAMS_IMAGE_ATTRIBUTE] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_IMAGE_ATTRIBUTE} } data, ok := dataRaw.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{ KEY_ACTIVITYSTREAMS_IMAGE_ATTRIBUTE, dataRaw, data, } } if len(data) != 1 { return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_IMAGE_ATTRIBUTE, 1, len(data)} } m, err := ParseMedia(data[0]) if err != nil { return nil, err } delete(raw, KEY_ACTIVITYSTREAMS_IMAGE_ATTRIBUTE) return &ASImageData{ Media: *m, Next: next, }, nil } func AppendASImageData(base BaseApChain, media Media) BaseApChain { return &ASImageData{base, media} } type ASMediaTypeData struct { FullValueType[string] } func (mediatypedata *ASMediaTypeData) GetSelfOrBase() (BaseApChain, bool) { return mediatypedata.Next, true } func (mediatypedata *ASMediaTypeData) MarshalToMap() map[string]any { return mediatypedata.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_MEDIATYPE) } func ParseASMediaTypeData(raw map[string]any, next BaseApChain) (BaseApChain, error) { tmp, err := ParseValueTypeWithName[string](raw, next, KEY_ACTIVITYSTREAMS_MEDIATYPE) if err != nil { return nil, err } return &ASMediaTypeData{*tmp}, nil } func AppendASMediaTypeData(base BaseApChain, data ValueValue[string]) BaseApChain { return &ASMediaTypeData{FullValueType[string]{base, data}} } type ASNameData struct { FullValueType[string] } func (namedata *ASNameData) GetSelfOrBase() (BaseApChain, bool) { return namedata.Next, true } func (namedata *ASNameData) MarshalToMap() map[string]any { return namedata.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_NAME) } func ParseASNameData(raw map[string]any, next BaseApChain) (BaseApChain, error) { tmp, err := ParseValueTypeWithName[string](raw, next, KEY_ACTIVITYSTREAMS_NAME) if err != nil { return nil, err } return &ASNameData{*tmp}, nil } func AppendASNameData(base BaseApChain, data ValueValue[string]) BaseApChain { return &ASNameData{FullValueType[string]{base, data}} } type ASOutboxData struct { FullIdType } func (attributedtodata *ASOutboxData) GetSelfOrBase() (BaseApChain, bool) { return attributedtodata.FullIdType.Next, true } func (attributedtodata *ASOutboxData) MarshalToMap() map[string]any { return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_OUTBOX) } func ParseASOutboxData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_OUTBOX) if err != nil { return nil, err } return &ASOutboxData{FullIdType: *id}, nil } func AppendASOutboxData(base BaseApChain, id string) BaseApChain { return &ASOutboxData{FullIdType{base, id}} } type ASObjectData struct { 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.Next, true } func (object *ASObjectData) MarshalToMap() map[string]any { return appendWithKey(object.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_OBJECT, object.Objects) } func ParseASObjectData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData1, ok := raw[KEY_ACTIVITYSTREAMS_OBJECT] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_OBJECT} } 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 } func AppendASObjectData(base BaseApChain, rawObjects []map[string]any) BaseApChain { return &ASObjectData{base, rawObjects} } type ASPreferredNameData struct { FullValueType[string] } func (namedata *ASPreferredNameData) GetSelfOrBase() (BaseApChain, bool) { return namedata.Next, true } func (namedata *ASPreferredNameData) MarshalToMap() map[string]any { return namedata.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_PREFFEREDUSERNAME) } func ParseASPreferredNameData(raw map[string]any, next BaseApChain) (BaseApChain, error) { tmp, err := ParseValueTypeWithName[string](raw, next, KEY_ACTIVITYSTREAMS_PREFFEREDUSERNAME) if err != nil { return nil, err } return &ASPreferredNameData{*tmp}, nil } func AppendASPreferredNameData(base BaseApChain, data ValueValue[string]) BaseApChain { return &ASPreferredNameData{FullValueType[string]{base, data}} } type ASPublishedData struct { Next BaseApChain Timestamp time.Time } func (publisheddata *ASPublishedData) GetSelfOrBase() (BaseApChain, bool) { return publisheddata.Next, true } func (publisheddata *ASPublishedData) MarshalToMap() map[string]any { m := publisheddata.Next.MarshalToMap() m[KEY_ACTIVITYSTREAMS_PUBLISHED] = timeToXmlTime(publisheddata.Timestamp) return m } func ParseASPublishedData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData1, ok := raw[KEY_ACTIVITYSTREAMS_PUBLISHED] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_PUBLISHED} } data1, ok := rawData1.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{ KEY_ACTIVITYSTREAMS_PUBLISHED, rawData1, data1, } } if len(data1) != 1 { return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_PUBLISHED, 1, len(data1)} } tmp, err := ParseValueValue[string](data1[0]) if err != nil { return nil, err } t, err := xmldatetime.Parse(tmp.Value) if err != nil { return nil, err } delete(raw, KEY_ACTIVITYSTREAMS_PUBLISHED) return &ASPublishedData{ Next: next, Timestamp: t, }, nil } func AppendASPublishedData(base BaseApChain, timestamp time.Time) BaseApChain { return &ASPublishedData{base, timestamp} } type ASRestrictedFollowData struct { FullValueType[bool] } func (namedata *ASRestrictedFollowData) GetSelfOrBase() (BaseApChain, bool) { return namedata.Next, true } func (namedata *ASRestrictedFollowData) MarshalToMap() map[string]any { return namedata.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_RESTRICTED_FOLLOW) } func ParseASRestrictedData(raw map[string]any, next BaseApChain) (BaseApChain, error) { tmp, err := ParseValueTypeWithName[bool](raw, next, KEY_ACTIVITYSTREAMS_RESTRICTED_FOLLOW) if err != nil { return nil, err } return &ASRestrictedFollowData{*tmp}, nil } func AppendASRestrictedFollowData(base BaseApChain, data ValueValue[bool]) BaseApChain { return &ASRestrictedFollowData{FullValueType[bool]{base, data}} } type ASRepliesData struct { FullIdType } func (object *ASRepliesData) GetSelfOrBase() (BaseApChain, bool) { return object.FullIdType.Next, true } func (object *ASRepliesData) MarshalToMap() map[string]any { return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_REPLIES) } func ParseASRepliesData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_REPLIES) if err != nil { return nil, err } return &ASRepliesData{FullIdType: *id}, nil } func AppendASRepliesData(base BaseApChain, id string) BaseApChain { return &ASRepliesData{FullIdType{base, id}} } type ASSharedInboxData struct { FullIdType } func (object *ASSharedInboxData) GetSelfOrBase() (BaseApChain, bool) { return object.FullIdType.Next, true } func (object *ASSharedInboxData) MarshalToMap() map[string]any { return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_SHAREDINBOX) } func ParseASSharedInboxData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_SHAREDINBOX) if err != nil { return nil, err } return &ASSharedInboxData{FullIdType: *id}, nil } func AppendASSharedInboxData(base BaseApChain, id string) BaseApChain { return &ASSharedInboxData{FullIdType{base, id}} } type ASSummaryData struct { FullValueType[string] } func (namedata *ASSummaryData) GetSelfOrBase() (BaseApChain, bool) { return namedata.Next, true } func (namedata *ASSummaryData) MarshalToMap() map[string]any { return namedata.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_SUMMARY) } func ParseASSummaryData(raw map[string]any, next BaseApChain) (BaseApChain, error) { tmp, err := ParseValueTypeWithName[string](raw, next, KEY_ACTIVITYSTREAMS_SUMMARY) if err != nil { return nil, err } return &ASSummaryData{*tmp}, nil } func AppendASSummaryData(base BaseApChain, data ValueValue[string]) BaseApChain { return &ASSummaryData{FullValueType[string]{base, data}} } type ASSensitiveData struct { FullValueType[bool] } func (namedata *ASSensitiveData) GetSelfOrBase() (BaseApChain, bool) { return namedata.Next, true } func (namedata *ASSensitiveData) MarshalToMap() map[string]any { return namedata.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_SENSITIVE) } func ParseASSensitiveData(raw map[string]any, next BaseApChain) (BaseApChain, error) { tmp, err := ParseValueTypeWithName[bool](raw, next, KEY_ACTIVITYSTREAMS_SENSITIVE) if err != nil { return nil, err } return &ASSensitiveData{*tmp}, nil } func AppendASSensitiveData(base BaseApChain, data ValueValue[bool]) BaseApChain { return &ASSensitiveData{FullValueType[bool]{base, data}} } type ASTagData struct { Next BaseApChain Tags []Tag } func (tagdata *ASTagData) GetSelfOrBase() (BaseApChain, bool) { return tagdata.Next, true } func (tagdata *ASTagData) MarshalToMap() map[string]any { return appendWithKey( tagdata.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_TAG, sliceutils.Map(tagdata.Tags, func(t Tag) map[string]any { return t.Marshal() }), ) } func ParseASTagData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData, ok := raw[KEY_ACTIVITYSTREAMS_TAG] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_TAG} } data, ok := rawData.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{KEY_ACTIVITYSTREAMS_TAG, rawData, data} } tags := []Tag{} for _, v := range data { tag, err := ParseTag(v) if err != nil { return nil, err } tags = append(tags, tag) } delete(raw, KEY_ACTIVITYSTREAMS_TAG) return &ASTagData{ Next: next, Tags: tags, }, nil } func AppendASTagData(base BaseApChain, tags []Tag) BaseApChain { return &ASTagData{base, tags} } type ASToData struct { Next BaseApChain Targets []string } func (cc *ASToData) GetSelfOrBase() (BaseApChain, bool) { return cc.Next, true } func (cc *ASToData) MarshalToMap() map[string]any { return appendWithKey( cc.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_TO, sliceutils.Map(cc.Targets, func(t string) map[string]any { return map[string]any{KEY_ID: t} }), ) } func ParseASToData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData1, ok := raw[KEY_ACTIVITYSTREAMS_TO] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_TO} } data1, ok := rawData1.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{KEY_ACTIVITYSTREAMS_TO, rawData1, data1} } targets := []string{} for _, v := range data1 { rawData2, ok := v[KEY_ID] if !ok { return nil, NoRequiredSubFieldError{KEY_ACTIVITYSTREAMS_TO, KEY_ID} } data2, ok := rawData2.(string) if !ok { return nil, BadFieldValueError[string]{KEY_ID, rawData2, data2} } targets = append(targets, data2) } delete(raw, KEY_ACTIVITYSTREAMS_TO) return &ASToData{ Next: next, Targets: targets, }, nil } func AppendASToData(base BaseApChain, targets ...string) BaseApChain { return &ASToData{base, targets} } type ASUrlData struct { FullIdType } func (object *ASUrlData) GetSelfOrBase() (BaseApChain, bool) { return object.FullIdType.Next, true } func (object *ASUrlData) MarshalToMap() map[string]any { return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_URL) } func ParseASUrlData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_URL) if err != nil { return nil, err } return &ASUrlData{FullIdType: *id}, nil } func AppendASUrlData(base BaseApChain, id string) BaseApChain { return &ASUrlData{FullIdType{base, id}} } type ASUpdatedData struct { Next BaseApChain Timestamp time.Time } func (publisheddata *ASUpdatedData) GetSelfOrBase() (BaseApChain, bool) { return publisheddata.Next, true } func (publisheddata *ASUpdatedData) MarshalToMap() map[string]any { m := publisheddata.Next.MarshalToMap() m[KEY_ACTIVITYSTREAMS_UPDATED] = timeToXmlTime(publisheddata.Timestamp) return m } func ParseASUpdatedData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData1, ok := raw[KEY_ACTIVITYSTREAMS_UPDATED] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_UPDATED} } data1, ok := rawData1.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{ KEY_ACTIVITYSTREAMS_UPDATED, rawData1, data1, } } if len(data1) != 1 { return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_UPDATED, 1, len(data1)} } tmp, err := ParseValueValue[string](data1[0]) if err != nil { return nil, err } t, err := xmldatetime.Parse(tmp.Value) if err != nil { return nil, err } delete(raw, KEY_ACTIVITYSTREAMS_UPDATED) return &ASPublishedData{ Next: next, Timestamp: t, }, nil } func AppendASUpdatedData(base BaseApChain, timestamp time.Time) BaseApChain { return &ASUpdatedData{base, timestamp} } type ASFirstData struct { Next BaseApChain // Technically the object is decodable into BaseApChain as well // but Go doesn't like the potential recursive call // So uhh, you have to do it yourself Objects map[string]any } func (a *ASFirstData) GetSelfOrBase() (BaseApChain, bool) { return a.Next, true } func (a *ASFirstData) MarshalToMap() map[string]any { return appendWithKey( a.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_FIRST, []map[string]any{a.Objects}, ) } func ParseASFirstData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData, ok := raw[KEY_ACTIVITYSTREAMS_FIRST] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_FIRST} } data, ok := rawData.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{KEY_ACTIVITYSTREAMS_FIRST, rawData, data} } if len(data) != 1 { return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_FIRST, 1, len(data)} } delete(raw, KEY_ACTIVITYSTREAMS_FIRST) return &ASFirstData{ Next: next, Objects: data[0], }, nil } func AppendASFirstData(base BaseApChain, rawObject map[string]any) BaseApChain { return &ASFirstData{base, rawObject} } type ASItemsData struct { Next BaseApChain // Items are all AP objects, but can't preparse since Go doesn't like the potential recursion Items []map[string]any } func (a *ASItemsData) GetSelfOrBase() (BaseApChain, bool) { return a.Next, true } func (a *ASItemsData) MarshalToMap() map[string]any { return appendWithKey(a.Next.MarshalToMap(), KEY_ACTIVITYSTREAMS_ITEMS, a.Items) } func ParseASItemsData(raw map[string]any, next BaseApChain) (BaseApChain, error) { rawData, ok := raw[KEY_ACTIVITYSTREAMS_ITEMS] if !ok { return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_ITEMS} } data, ok := rawData.([]map[string]any) if !ok { return nil, BadFieldValueError[[]map[string]any]{KEY_ACTIVITYSTREAMS_ITEMS, rawData, data} } return &ASItemsData{Next: next, Items: data}, nil } func AppendASItemsData(base BaseApChain, rawObjects ...map[string]any) BaseApChain { return &ASItemsData{base, rawObjects} } type ASNextData struct { FullIdType } func (object *ASNextData) GetSelfOrBase() (BaseApChain, bool) { return object.FullIdType.Next, true } func (object *ASNextData) MarshalToMap() map[string]any { return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_NEXT) } func ParseASNextData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_NEXT) if err != nil { return nil, err } return &ASNextData{FullIdType: *id}, nil } func AppendASNextData(base BaseApChain, id string) BaseApChain { return &ASNextData{FullIdType{base, id}} } type ASPartOfData struct { FullIdType } func (object *ASPartOfData) GetSelfOrBase() (BaseApChain, bool) { return object.FullIdType.Next, true } func (object *ASPartOfData) MarshalToMap() map[string]any { return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_PARTOF) } func ParseASPartOfData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_PARTOF) if err != nil { return nil, err } return &ASPartOfData{FullIdType: *id}, nil } func AppendASPartOfData(base BaseApChain, id string) BaseApChain { return &ASPartOfData{FullIdType{base, id}} } type ASInReplyToData struct { FullIdType } func (a *ASInReplyToData) GetSelfOrBase() (BaseApChain, bool) { return a.Next, true } func (a *ASInReplyToData) MarshalToMap() map[string]any { return a.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_INREPLYTO) } func ParseASInReplyToData(raw map[string]any, next BaseApChain) (BaseApChain, error) { id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_INREPLYTO) if err != nil { return nil, err } return &ASInReplyToData{*id}, nil } func AppendASInReplyToData(base BaseApChain, id string) BaseApChain { return &ASInReplyToData{FullIdType{base, id}} } type ASQuoteUrlData struct { FullValueType[string] } func (namedata *ASQuoteUrlData) GetSelfOrBase() (BaseApChain, bool) { return namedata.Next, true } func (namedata *ASQuoteUrlData) MarshalToMap() map[string]any { return namedata.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_QUOTEURL) } func ParseASQuoteUrlData(raw map[string]any, next BaseApChain) (BaseApChain, error) { tmp, err := ParseValueTypeWithName[string](raw, next, KEY_ACTIVITYSTREAMS_QUOTEURL) if err != nil { return nil, err } return &ASQuoteUrlData{*tmp}, nil } func AppendASQuoteUrlData(base BaseApChain, data ValueValue[string]) BaseApChain { return &ASQuoteUrlData{FullValueType[string]{base, data}} }