sync for backup
This commit is contained in:
parent
56947af7df
commit
ed8c316f01
9 changed files with 947 additions and 11 deletions
|
@ -32,7 +32,7 @@ func ParseIdTypeWithName(m map[string]any, b BaseApChain, name string) (*FullIdT
|
||||||
}
|
}
|
||||||
data1, ok := rawData1.([]map[string]any)
|
data1, ok := rawData1.([]map[string]any)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, BadFieldValueError{name, rawData1, []map[string]any{{}}}
|
return nil, BadFieldValueError[[]map[string]any]{name, rawData1, []map[string]any{{}}}
|
||||||
}
|
}
|
||||||
if len(data1) != 1 {
|
if len(data1) != 1 {
|
||||||
return nil, BadFieldArrayLengthError{name, 1, len(data1)}
|
return nil, BadFieldArrayLengthError{name, 1, len(data1)}
|
||||||
|
@ -43,7 +43,7 @@ func ParseIdTypeWithName(m map[string]any, b BaseApChain, name string) (*FullIdT
|
||||||
}
|
}
|
||||||
data2, ok := rawData1.(string)
|
data2, ok := rawData1.(string)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, BadFieldValueError{name, rawData2, ""}
|
return nil, BadFieldValueError[string]{name, rawData2, ""}
|
||||||
}
|
}
|
||||||
return &FullIdType{
|
return &FullIdType{
|
||||||
Next: b,
|
Next: b,
|
||||||
|
|
23
errors.go
23
errors.go
|
@ -10,15 +10,16 @@ func (n NoRequiredFieldError) Error() string {
|
||||||
return fmt.Sprintf("no attribute named %s", n.FieldName)
|
return fmt.Sprintf("no attribute named %s", n.FieldName)
|
||||||
}
|
}
|
||||||
|
|
||||||
type BadFieldValueError struct {
|
// Expected is a string representation of the expected type
|
||||||
|
type BadFieldValueError[T any] struct {
|
||||||
FieldName string
|
FieldName string
|
||||||
RawValue any
|
RawValue any
|
||||||
Expected any
|
Expected T
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b BadFieldValueError) Error() string {
|
func (b BadFieldValueError[T]) Error() string {
|
||||||
return fmt.Sprintf(
|
return fmt.Sprintf(
|
||||||
"attribute %s has a bad raw value, inspect error struct for raw and expected value",
|
"attribute %s has a bad raw value, inspect error struct for raw and expected type",
|
||||||
b.FieldName,
|
b.FieldName,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -46,3 +47,17 @@ type NoRequiredSubFieldError struct {
|
||||||
func (n NoRequiredSubFieldError) Error() string {
|
func (n NoRequiredSubFieldError) Error() string {
|
||||||
return fmt.Sprintf("missing subfield %s for attribute %s", n.Subfield, n.FieldName)
|
return fmt.Sprintf("missing subfield %s for attribute %s", n.Subfield, n.FieldName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type NotImplementedError struct{}
|
||||||
|
|
||||||
|
func (n NotImplementedError) Error() string {
|
||||||
|
return "Feature not implemented yet"
|
||||||
|
}
|
||||||
|
|
||||||
|
type UnknownTagType struct {
|
||||||
|
TagType string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u UnknownTagType) Error() string {
|
||||||
|
return fmt.Sprintf("Unknown tag type: %s", u.TagType)
|
||||||
|
}
|
||||||
|
|
79
examples/mk_note_random.json
Normal file
79
examples/mk_note_random.json
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"@id": "https://plasmatrap.com/notes/9wona1fblx",
|
||||||
|
"@type": [
|
||||||
|
"https://www.w3.org/ns/activitystreams#Note"
|
||||||
|
],
|
||||||
|
"https://misskey-hub.net/ns#_misskey_content": [
|
||||||
|
{
|
||||||
|
"@value": "After having kept @lunduke@linuxrocks.online suspended locally for a few days, I have now seen the admin of linuxrocks.online be a fan of [\"unpopular opinions\" (transphobia and other bullshit)](https://linuxrocks.online/@yisraeldov/112885717416855799) and [ignoring all reports](https://linuxrocks.online/@yisraeldov/112865583454794746), warning the people that reported lunduke for being an ass. As a result, federation with linuxrocks.online will be suspended tomorrow, $[unixtime 1723197600]."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#attachment": [],
|
||||||
|
"https://www.w3.org/ns/activitystreams#attributedTo": [
|
||||||
|
{
|
||||||
|
"@id": "https://plasmatrap.com/users/9fxq5dv2icicia1w"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#cc": [
|
||||||
|
{
|
||||||
|
"@id": "https://plasmatrap.com/users/9fxq5dv2icicia1w/followers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@id": "https://linuxrocks.online/users/lunduke"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#content": [
|
||||||
|
{
|
||||||
|
"@value": "\u003cp\u003eAfter having kept \u003ca href=\"https://linuxrocks.online/@lunduke\" class=\"u-url mention\"\u003e@lunduke@linuxrocks.online\u003c/a\u003e suspended locally for a few days, I have now seen the admin of linuxrocks.online be a fan of \u003ca href=\"https://linuxrocks.online/@yisraeldov/112885717416855799\"\u003e\"unpopular opinions\" (transphobia and other bullshit)\u003c/a\u003e and \u003ca href=\"https://linuxrocks.online/@yisraeldov/112865583454794746\"\u003eignoring all reports\u003c/a\u003e\u003cspan\u003e, warning the people that reported lunduke for being an ass.\u003cbr\u003e\u003cbr\u003eAs a result, federation with linuxrocks.online will be suspended tomorrow, \u003c/span\u003e\u003ctime datetime=\"2024-08-09T10:00:00.000Z\"\u003e2024-08-09T10:00:00.000Z\u003c/time\u003e.\u003c/p\u003e"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#published": [
|
||||||
|
{
|
||||||
|
"@type": "http://www.w3.org/2001/XMLSchema#dateTime",
|
||||||
|
"@value": "2024-08-08T09:33:19.415Z"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#sensitive": [
|
||||||
|
{
|
||||||
|
"@value": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#source": [
|
||||||
|
{
|
||||||
|
"https://www.w3.org/ns/activitystreams#content": [
|
||||||
|
{
|
||||||
|
"@value": "After having kept @lunduke@linuxrocks.online suspended locally for a few days, I have now seen the admin of linuxrocks.online be a fan of [\"unpopular opinions\" (transphobia and other bullshit)](https://linuxrocks.online/@yisraeldov/112885717416855799) and [ignoring all reports](https://linuxrocks.online/@yisraeldov/112865583454794746), warning the people that reported lunduke for being an ass. As a result, federation with linuxrocks.online will be suspended tomorrow, $[unixtime 1723197600]."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#mediaType": [
|
||||||
|
{
|
||||||
|
"@value": "text/x.misskeymarkdown"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#tag": [
|
||||||
|
{
|
||||||
|
"@type": [
|
||||||
|
"https://www.w3.org/ns/activitystreams#Mention"
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#href": [
|
||||||
|
{
|
||||||
|
"@id": "https://linuxrocks.online/users/lunduke"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#name": [
|
||||||
|
{
|
||||||
|
"@value": "@lunduke@linuxrocks.online"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://www.w3.org/ns/activitystreams#to": [
|
||||||
|
{
|
||||||
|
"@id": "https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
60
examples/raw/mk_note_random.json
Normal file
60
examples/raw/mk_note_random.json
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
{
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://w3id.org/security/v1",
|
||||||
|
{
|
||||||
|
"Key": "sec:Key",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"quoteUrl": "as:quoteUrl",
|
||||||
|
"fedibird": "http://fedibird.com/ns#",
|
||||||
|
"quoteUri": "fedibird:quoteUri",
|
||||||
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
"Emoji": "toot:Emoji",
|
||||||
|
"featured": "toot:featured",
|
||||||
|
"discoverable": "toot:discoverable",
|
||||||
|
"schema": "http://schema.org#",
|
||||||
|
"PropertyValue": "schema:PropertyValue",
|
||||||
|
"value": "schema:value",
|
||||||
|
"misskey": "https://misskey-hub.net/ns#",
|
||||||
|
"_misskey_content": "misskey:_misskey_content",
|
||||||
|
"_misskey_quote": "misskey:_misskey_quote",
|
||||||
|
"_misskey_reaction": "misskey:_misskey_reaction",
|
||||||
|
"_misskey_votes": "misskey:_misskey_votes",
|
||||||
|
"_misskey_summary": "misskey:_misskey_summary",
|
||||||
|
"isCat": "misskey:isCat",
|
||||||
|
"firefish": "https://joinfirefish.org/ns#",
|
||||||
|
"speakAsCat": "firefish:speakAsCat",
|
||||||
|
"sharkey": "https://joinsharkey.org/ns#",
|
||||||
|
"backgroundUrl": "sharkey:backgroundUrl",
|
||||||
|
"listenbrainz": "sharkey:listenbrainz",
|
||||||
|
"vcard": "http://www.w3.org/2006/vcard/ns#"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"id": "https://plasmatrap.com/notes/9wona1fblx",
|
||||||
|
"type": "Note",
|
||||||
|
"attributedTo": "https://plasmatrap.com/users/9fxq5dv2icicia1w",
|
||||||
|
"content": "<p>After having kept <a href=\"https://linuxrocks.online/@lunduke\" class=\"u-url mention\">@lunduke@linuxrocks.online</a> suspended locally for a few days, I have now seen the admin of linuxrocks.online be a fan of <a href=\"https://linuxrocks.online/@yisraeldov/112885717416855799\">\"unpopular opinions\" (transphobia and other bullshit)</a> and <a href=\"https://linuxrocks.online/@yisraeldov/112865583454794746\">ignoring all reports</a><span>, warning the people that reported lunduke for being an ass.<br><br>As a result, federation with linuxrocks.online will be suspended tomorrow, </span><time datetime=\"2024-08-09T10:00:00.000Z\">2024-08-09T10:00:00.000Z</time>.</p>",
|
||||||
|
"_misskey_content": "After having kept @lunduke@linuxrocks.online suspended locally for a few days, I have now seen the admin of linuxrocks.online be a fan of [\"unpopular opinions\" (transphobia and other bullshit)](https://linuxrocks.online/@yisraeldov/112885717416855799) and [ignoring all reports](https://linuxrocks.online/@yisraeldov/112865583454794746), warning the people that reported lunduke for being an ass. As a result, federation with linuxrocks.online will be suspended tomorrow, $[unixtime 1723197600].",
|
||||||
|
"source": {
|
||||||
|
"content": "After having kept @lunduke@linuxrocks.online suspended locally for a few days, I have now seen the admin of linuxrocks.online be a fan of [\"unpopular opinions\" (transphobia and other bullshit)](https://linuxrocks.online/@yisraeldov/112885717416855799) and [ignoring all reports](https://linuxrocks.online/@yisraeldov/112865583454794746), warning the people that reported lunduke for being an ass. As a result, federation with linuxrocks.online will be suspended tomorrow, $[unixtime 1723197600].",
|
||||||
|
"mediaType": "text/x.misskeymarkdown"
|
||||||
|
},
|
||||||
|
"published": "2024-08-08T09:33:19.415Z",
|
||||||
|
"to": ["https://www.w3.org/ns/activitystreams#Public"],
|
||||||
|
"cc": [
|
||||||
|
"https://plasmatrap.com/users/9fxq5dv2icicia1w/followers",
|
||||||
|
"https://linuxrocks.online/users/lunduke"
|
||||||
|
],
|
||||||
|
"inReplyTo": null,
|
||||||
|
"attachment": [],
|
||||||
|
"sensitive": false,
|
||||||
|
"tag": [
|
||||||
|
{
|
||||||
|
"type": "Mention",
|
||||||
|
"href": "https://linuxrocks.online/users/lunduke",
|
||||||
|
"name": "@lunduke@linuxrocks.online"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
5
go.mod
5
go.mod
|
@ -4,6 +4,11 @@ go 1.22.5
|
||||||
|
|
||||||
require github.com/piprate/json-gold v0.5.0
|
require github.com/piprate/json-gold v0.5.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/datainq/xml-date-time v0.0.0-20170820214645-2292f08baa38 // indirect
|
||||||
|
github.com/samber/go-type-to-string v1.7.0 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect
|
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect
|
||||||
github.com/stretchr/testify v1.9.0 // indirect
|
github.com/stretchr/testify v1.9.0 // indirect
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -1,3 +1,5 @@
|
||||||
|
github.com/datainq/xml-date-time v0.0.0-20170820214645-2292f08baa38 h1:cUoduvNB9/JFJYEVeKy2hX/R5qyg2uwnHVhXCIjhBeI=
|
||||||
|
github.com/datainq/xml-date-time v0.0.0-20170820214645-2292f08baa38/go.mod h1:a0PnbhSGmzFMGx9KdEqfEdDHoEwTF9KLNbKLcWD8kAo=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/piprate/json-gold v0.5.0 h1:RmGh1PYboCFcchVFuh2pbSWAZy4XJaqTMU4KQYsApbM=
|
github.com/piprate/json-gold v0.5.0 h1:RmGh1PYboCFcchVFuh2pbSWAZy4XJaqTMU4KQYsApbM=
|
||||||
|
@ -6,6 +8,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU=
|
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU=
|
||||||
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
||||||
|
github.com/samber/go-type-to-string v1.7.0 h1:FiSstaAikHMUSLt5bhVlsvCnD7bbQzC8L0UkkGS3Bj8=
|
||||||
|
github.com/samber/go-type-to-string v1.7.0/go.mod h1:jpU77vIDoIxkahknKDoEx9C8bQ1ADnh2sotZ8I4QqBU=
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
gitlab.com/mstarongitlab/goutils v1.3.0 h1:uuxPHjIU36lyJ8/z4T2xI32zOyh53Xj0Au8K12qkaJ4=
|
gitlab.com/mstarongitlab/goutils v1.3.0 h1:uuxPHjIU36lyJ8/z4T2xI32zOyh53Xj0Au8K12qkaJ4=
|
||||||
|
|
|
@ -3,6 +3,7 @@ package goap
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/datainq/xml-date-time"
|
||||||
"gitlab.com/mstarongitlab/goutils/sliceutils"
|
"gitlab.com/mstarongitlab/goutils/sliceutils"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -18,6 +19,14 @@ func (actor *ASActorData) MarshalToMap() map[string]any {
|
||||||
return actor.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_ACTOR)
|
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
|
||||||
|
}
|
||||||
|
|
||||||
type ASAlsoKnownAsData struct {
|
type ASAlsoKnownAsData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Urls []string
|
Urls []string
|
||||||
|
@ -37,6 +46,37 @@ func (cc *ASAlsoKnownAsData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASAlsoKnownAsData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
rawData1, ok := raw[KEY_ACTIVITYSTREAMS_ALSOKNOWNAS]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_ALSOKNOWNAS}
|
||||||
|
}
|
||||||
|
data1, ok := rawData1.([]map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]map[string]any]{
|
||||||
|
KEY_ACTIVITYSTREAMS_ALSOKNOWNAS,
|
||||||
|
rawData1,
|
||||||
|
[]map[string]any{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
urls := []string{}
|
||||||
|
for _, v := range data1 {
|
||||||
|
rawData2, ok := v[KEY_ID]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredSubFieldError{KEY_ACTIVITYSTREAMS_ALSOKNOWNAS, KEY_ID}
|
||||||
|
}
|
||||||
|
data2, ok := rawData2.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[string]{KEY_ACTIVITYSTREAMS_ALSOKNOWNAS, rawData2, ""}
|
||||||
|
}
|
||||||
|
urls = append(urls, data2)
|
||||||
|
}
|
||||||
|
return &ASAlsoKnownAsData{
|
||||||
|
Next: next,
|
||||||
|
Urls: urls,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASAttachmentsData struct {
|
type ASAttachmentsData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Attachments []Attachment
|
Attachments []Attachment
|
||||||
|
@ -57,6 +97,34 @@ func (attachmentsdata *ASAttachmentsData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
return &ASAttachmentsData{
|
||||||
|
Next: next,
|
||||||
|
Attachments: attachments,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASAttributedToData struct {
|
type ASAttributedToData struct {
|
||||||
FullIdType
|
FullIdType
|
||||||
}
|
}
|
||||||
|
@ -69,6 +137,14 @@ func (attributedtodata *ASAttributedToData) MarshalToMap() map[string]any {
|
||||||
return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_ATTRIBUTEDTO)
|
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
|
||||||
|
}
|
||||||
|
|
||||||
type ASCCData struct {
|
type ASCCData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Targets []string
|
Targets []string
|
||||||
|
@ -88,6 +164,38 @@ func (cc *ASCCData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
return &ASCCData{
|
||||||
|
Next: next,
|
||||||
|
Targets: ccs,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 {
|
type ASContentData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Content []ValueValue[string]
|
Content []ValueValue[string]
|
||||||
|
@ -107,6 +215,33 @@ func (contentdata *ASContentData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
return &ASContentData{
|
||||||
|
Next: next,
|
||||||
|
Content: contents,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASEndpointsData struct {
|
type ASEndpointsData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Endpoints map[string]string
|
Endpoints map[string]string
|
||||||
|
@ -128,6 +263,48 @@ func (endpointsdata *ASEndpointsData) MarshalToMap() map[string]any {
|
||||||
return m
|
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
|
||||||
|
}
|
||||||
|
return &ASEndpointsData{
|
||||||
|
Next: next,
|
||||||
|
Endpoints: endpoints,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASFollowersData struct {
|
type ASFollowersData struct {
|
||||||
FullIdType
|
FullIdType
|
||||||
}
|
}
|
||||||
|
@ -140,6 +317,14 @@ func (attributedtodata *ASFollowersData) MarshalToMap() map[string]any {
|
||||||
return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_FOLLOWERS)
|
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 &ASAttributedToData{FullIdType: *id}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASFollowingData struct {
|
type ASFollowingData struct {
|
||||||
FullIdType
|
FullIdType
|
||||||
}
|
}
|
||||||
|
@ -152,6 +337,14 @@ func (attributedtodata *ASFollowingData) MarshalToMap() map[string]any {
|
||||||
return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_FOLLOWING)
|
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 &ASAttributedToData{FullIdType: *id}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASHrefData struct {
|
type ASHrefData struct {
|
||||||
FullIdType
|
FullIdType
|
||||||
}
|
}
|
||||||
|
@ -164,6 +357,14 @@ func (attributedtodata *ASHrefData) MarshalToMap() map[string]any {
|
||||||
return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_HREF)
|
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 &ASAttributedToData{FullIdType: *id}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASIconData struct {
|
type ASIconData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Media Media
|
Media Media
|
||||||
|
@ -181,6 +382,28 @@ func (icondata *ASIconData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
return &ASIconData{
|
||||||
|
Media: *m,
|
||||||
|
Next: next,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASImageData struct {
|
type ASImageData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Media Media
|
Media Media
|
||||||
|
@ -198,6 +421,32 @@ func (icondata *ASImageData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
return &ASImageData{
|
||||||
|
Media: *m,
|
||||||
|
Next: next,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASMediaTypeData struct {
|
type ASMediaTypeData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Type string
|
Type string
|
||||||
|
@ -219,6 +468,32 @@ func (mediatypedata *ASMediaTypeData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASMediaTypeData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
rawData1, ok := raw[KEY_ACTIVITYSTREAMS_MEDIATYPE]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_MEDIATYPE}
|
||||||
|
}
|
||||||
|
data1, ok := rawData1.([]map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]map[string]any]{
|
||||||
|
KEY_ACTIVITYSTREAMS_MEDIATYPE,
|
||||||
|
rawData1,
|
||||||
|
data1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(data1) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_MEDIATYPE, 1, len(data1)}
|
||||||
|
}
|
||||||
|
tmp, err := ParseValueValue[string](data1[0])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ASMediaTypeData{
|
||||||
|
Next: next,
|
||||||
|
Type: tmp.Value,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASNameData struct {
|
type ASNameData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Name ValueValue[string]
|
Name ValueValue[string]
|
||||||
|
@ -236,6 +511,32 @@ func (namedata *ASNameData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASNameData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
rawData1, ok := raw[KEY_ACTIVITYSTREAMS_NAME]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_NAME}
|
||||||
|
}
|
||||||
|
data1, ok := rawData1.([]map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]map[string]any]{
|
||||||
|
KEY_ACTIVITYSTREAMS_NAME,
|
||||||
|
rawData1,
|
||||||
|
data1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(data1) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_NAME, 1, len(data1)}
|
||||||
|
}
|
||||||
|
tmp, err := ParseValueValue[string](data1[0])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ASNameData{
|
||||||
|
Next: next,
|
||||||
|
Name: *tmp,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASOutboxData struct {
|
type ASOutboxData struct {
|
||||||
FullIdType
|
FullIdType
|
||||||
}
|
}
|
||||||
|
@ -248,6 +549,14 @@ func (attributedtodata *ASOutboxData) MarshalToMap() map[string]any {
|
||||||
return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_HREF)
|
return attributedtodata.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_HREF)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
type ASObjectData struct {
|
type ASObjectData struct {
|
||||||
FullIdType
|
FullIdType
|
||||||
}
|
}
|
||||||
|
@ -260,6 +569,14 @@ func (object *ASObjectData) MarshalToMap() map[string]any {
|
||||||
return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_OBJECT)
|
return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_OBJECT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASObjectData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
id, err := ParseIdTypeWithName(raw, next, KEY_ACTIVITYSTREAMS_OBJECT)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ASObjectData{FullIdType: *id}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASPreferredNameData struct {
|
type ASPreferredNameData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Name ValueValue[string]
|
Name ValueValue[string]
|
||||||
|
@ -277,6 +594,32 @@ func (namedata *ASPreferredNameData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASPreferredNameData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
rawData1, ok := raw[KEY_ACTIVITYSTREAMS_PREFFEREDUSERNAME]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_PREFFEREDUSERNAME}
|
||||||
|
}
|
||||||
|
data1, ok := rawData1.([]map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]map[string]any]{
|
||||||
|
KEY_ACTIVITYSTREAMS_PREFFEREDUSERNAME,
|
||||||
|
rawData1,
|
||||||
|
data1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(data1) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_PREFFEREDUSERNAME, 1, len(data1)}
|
||||||
|
}
|
||||||
|
tmp, err := ParseValueValue[string](data1[0])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ASPreferredNameData{
|
||||||
|
Next: next,
|
||||||
|
Name: *tmp,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASPublishedData struct {
|
type ASPublishedData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Timestamp time.Time
|
Timestamp time.Time
|
||||||
|
@ -292,6 +635,37 @@ func (publisheddata *ASPublishedData) MarshalToMap() map[string]any {
|
||||||
return m
|
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
|
||||||
|
}
|
||||||
|
return &ASPublishedData{
|
||||||
|
Next: next,
|
||||||
|
Timestamp: t,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASRestrictedFollowData struct {
|
type ASRestrictedFollowData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Value ValueValue[bool]
|
Value ValueValue[bool]
|
||||||
|
@ -309,6 +683,32 @@ func (namedata *ASRestrictedFollowData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASRestrictedData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
rawData1, ok := raw[KEY_ACTIVITYSTREAMS_RESTRICTED_FOLLOW]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_RESTRICTED_FOLLOW}
|
||||||
|
}
|
||||||
|
data1, ok := rawData1.([]map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]map[string]any]{
|
||||||
|
KEY_ACTIVITYSTREAMS_RESTRICTED_FOLLOW,
|
||||||
|
rawData1,
|
||||||
|
data1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(data1) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_RESTRICTED_FOLLOW, 1, len(data1)}
|
||||||
|
}
|
||||||
|
tmp, err := ParseValueValue[bool](data1[0])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ASRestrictedFollowData{
|
||||||
|
Next: next,
|
||||||
|
Value: *tmp,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASRepliesData struct {
|
type ASRepliesData struct {
|
||||||
FullIdType
|
FullIdType
|
||||||
}
|
}
|
||||||
|
@ -321,6 +721,14 @@ func (object *ASRepliesData) MarshalToMap() map[string]any {
|
||||||
return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_REPLIES)
|
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
|
||||||
|
}
|
||||||
|
|
||||||
type ASSharedInboxData struct {
|
type ASSharedInboxData struct {
|
||||||
FullIdType
|
FullIdType
|
||||||
}
|
}
|
||||||
|
@ -333,6 +741,14 @@ func (object *ASSharedInboxData) MarshalToMap() map[string]any {
|
||||||
return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_SHAREDINBOX)
|
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
|
||||||
|
}
|
||||||
|
|
||||||
type ASSummaryData struct {
|
type ASSummaryData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Name ValueValue[string]
|
Name ValueValue[string]
|
||||||
|
@ -350,6 +766,32 @@ func (namedata *ASSummaryData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASSummaryData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
rawData1, ok := raw[KEY_ACTIVITYSTREAMS_SUMMARY]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_SUMMARY}
|
||||||
|
}
|
||||||
|
data1, ok := rawData1.([]map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]map[string]any]{
|
||||||
|
KEY_ACTIVITYSTREAMS_SUMMARY,
|
||||||
|
rawData1,
|
||||||
|
data1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(data1) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_SUMMARY, 1, len(data1)}
|
||||||
|
}
|
||||||
|
tmp, err := ParseValueValue[string](data1[0])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ASSummaryData{
|
||||||
|
Next: next,
|
||||||
|
Name: *tmp,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASSensitiveData struct {
|
type ASSensitiveData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Name ValueValue[bool]
|
Name ValueValue[bool]
|
||||||
|
@ -367,9 +809,35 @@ func (namedata *ASSensitiveData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASSensitiveData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
rawData1, ok := raw[KEY_ACTIVITYSTREAMS_SENSITIVE]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_SENSITIVE}
|
||||||
|
}
|
||||||
|
data1, ok := rawData1.([]map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]map[string]any]{
|
||||||
|
KEY_ACTIVITYSTREAMS_SENSITIVE,
|
||||||
|
rawData1,
|
||||||
|
data1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(data1) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_SENSITIVE, 1, len(data1)}
|
||||||
|
}
|
||||||
|
tmp, err := ParseValueValue[bool](data1[0])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ASSensitiveData{
|
||||||
|
Next: next,
|
||||||
|
Name: *tmp,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
type ASTagData struct {
|
type ASTagData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Tags []string
|
Tags []Tag
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tagdata *ASTagData) GetSelfOrBase() (BaseApChain, bool) {
|
func (tagdata *ASTagData) GetSelfOrBase() (BaseApChain, bool) {
|
||||||
|
@ -380,12 +848,16 @@ func (tagdata *ASTagData) MarshalToMap() map[string]any {
|
||||||
return appendWithKey(
|
return appendWithKey(
|
||||||
tagdata.Next.MarshalToMap(),
|
tagdata.Next.MarshalToMap(),
|
||||||
KEY_ACTIVITYSTREAMS_TAG,
|
KEY_ACTIVITYSTREAMS_TAG,
|
||||||
sliceutils.Map(tagdata.Tags, func(t string) map[string]any {
|
sliceutils.Map(tagdata.Tags, func(t Tag) map[string]any {
|
||||||
return map[string]any{KEY_ID: t}
|
return t.Marshal()
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASTagData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
return nil, NotImplementedError{}
|
||||||
|
}
|
||||||
|
|
||||||
type ASToData struct {
|
type ASToData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Targets []string
|
Targets []string
|
||||||
|
@ -405,6 +877,10 @@ func (cc *ASToData) MarshalToMap() map[string]any {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASToData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
return nil, NotImplementedError{}
|
||||||
|
}
|
||||||
|
|
||||||
type ASUrlData struct {
|
type ASUrlData struct {
|
||||||
FullIdType
|
FullIdType
|
||||||
}
|
}
|
||||||
|
@ -417,6 +893,14 @@ func (object *ASUrlData) MarshalToMap() map[string]any {
|
||||||
return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_SHAREDINBOX)
|
return object.FullIdType.MarshalToMapWithName(KEY_ACTIVITYSTREAMS_SHAREDINBOX)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
type ASUpdatedData struct {
|
type ASUpdatedData struct {
|
||||||
Next BaseApChain
|
Next BaseApChain
|
||||||
Timestamp time.Time
|
Timestamp time.Time
|
||||||
|
@ -431,3 +915,7 @@ func (publisheddata *ASUpdatedData) MarshalToMap() map[string]any {
|
||||||
m[KEY_ACTIVITYSTREAMS_PUBLISHED] = timeToXmlTime(publisheddata.Timestamp)
|
m[KEY_ACTIVITYSTREAMS_PUBLISHED] = timeToXmlTime(publisheddata.Timestamp)
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseASUpdatedData(raw map[string]any, next BaseApChain) (BaseApChain, error) {
|
||||||
|
return nil, NotImplementedError{}
|
||||||
|
}
|
||||||
|
|
130
tags.go
Normal file
130
tags.go
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
package goap
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
// go-sumtype:decl TagSum
|
||||||
|
type Tag interface {
|
||||||
|
// TagEmoji | TagMention | TagHashtag
|
||||||
|
|
||||||
|
Marshal() map[string]any
|
||||||
|
sealed()
|
||||||
|
}
|
||||||
|
|
||||||
|
type TagEmoji struct {
|
||||||
|
Id string
|
||||||
|
Icon Media
|
||||||
|
Name string
|
||||||
|
LastUpdated time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t TagEmoji) sealed() {}
|
||||||
|
func (t TagEmoji) Marshal() map[string]any {
|
||||||
|
m := map[string]any{
|
||||||
|
KEY_ID: t.Id,
|
||||||
|
KEY_TYPE: []string{KEY_MASTO_EMOJI},
|
||||||
|
KEY_ACTIVITYSTREAMS_ICON: []map[string]any{t.Icon.Marshal()},
|
||||||
|
KEY_ACTIVITYSTREAMS_NAME: []map[string]any{{KEY_VALUE: t.Name}},
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
type TagMention struct {
|
||||||
|
TargetId string
|
||||||
|
TargetName string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t TagMention) sealed() {}
|
||||||
|
func (t TagMention) Marshal() map[string]any {
|
||||||
|
return map[string]any{
|
||||||
|
KEY_TYPE: []string{KEY_ACTIVITYSTREAMS_MENTION},
|
||||||
|
KEY_ACTIVITYSTREAMS_HREF: []map[string]any{{KEY_ID: t.TargetId}},
|
||||||
|
KEY_ACTIVITYSTREAMS_NAME: []map[string]any{{KEY_VALUE: t.TargetName}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type TagHashtag struct {
|
||||||
|
Url string
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t TagHashtag) sealed() {}
|
||||||
|
func (t TagHashtag) Marshal() map[string]any {
|
||||||
|
return map[string]any{
|
||||||
|
KEY_TYPE: []string{KEY_ACTIVITYSTREAMS_HASHTAG},
|
||||||
|
KEY_ACTIVITYSTREAMS_HREF: []map[string]any{{KEY_ID: t.Url}},
|
||||||
|
KEY_ACTIVITYSTREAMS_NAME: []map[string]any{{KEY_VALUE: t.Name}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseTag(raw map[string]any) (Tag, error) {
|
||||||
|
rawTypeArr, ok := raw[KEY_TYPE]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_TYPE}
|
||||||
|
}
|
||||||
|
typeArr, ok := rawTypeArr.([]string)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]string]{KEY_TYPE, rawTypeArr, typeArr}
|
||||||
|
}
|
||||||
|
if len(typeArr) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_TYPE, 1, len(typeArr)}
|
||||||
|
}
|
||||||
|
tagType := typeArr[0]
|
||||||
|
switch tagType {
|
||||||
|
case KEY_MASTO_EMOJI:
|
||||||
|
return parseEmojiTag(raw)
|
||||||
|
case KEY_ACTIVITYSTREAMS_MENTION:
|
||||||
|
return parseMentionTag(raw)
|
||||||
|
case KEY_ACTIVITYSTREAMS_HASHTAG:
|
||||||
|
return parseHashtagTag(raw)
|
||||||
|
default:
|
||||||
|
return nil, UnknownTagType{TagType: tagType}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseEmojiTag(raw map[string]any) (*TagEmoji, 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, id}
|
||||||
|
}
|
||||||
|
media, err := ParseASIconData(raw, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
rawName1, ok := raw[KEY_ACTIVITYSTREAMS_NAME]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_NAME}
|
||||||
|
}
|
||||||
|
name1, ok := rawName1.([]map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]map[string]any]{KEY_ACTIVITYSTREAMS_NAME, rawName1, name1}
|
||||||
|
}
|
||||||
|
if len(name1) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_NAME, 1, len(name1)}
|
||||||
|
}
|
||||||
|
rawName2, ok := name1[0][KEY_VALUE]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredSubFieldError{KEY_ACTIVITYSTREAMS_NAME, KEY_VALUE}
|
||||||
|
}
|
||||||
|
name2, ok := rawName2.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[string]{KEY_VALUE, rawName2, name2}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Casting media to ASIconData without check is ok here
|
||||||
|
// Reason: ParseASIconData returns an BaseAPChain, an interface.
|
||||||
|
// However, the function guarantees that, if it doesn't error out, you get an ASIconData struct back
|
||||||
|
return &TagEmoji{Id: id, Icon: media.(*ASIconData).Media, Name: name2}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseMentionTag(raw map[string]any) (*TagMention, error) {
|
||||||
|
return nil, NotImplementedError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseHashtagTag(raw map[string]any) (*TagHashtag, error) {
|
||||||
|
return nil, NotImplementedError{}
|
||||||
|
}
|
159
variousTypes.go
159
variousTypes.go
|
@ -1,6 +1,8 @@
|
||||||
package goap
|
package goap
|
||||||
|
|
||||||
import "maps"
|
import (
|
||||||
|
"maps"
|
||||||
|
)
|
||||||
|
|
||||||
type PublicKey struct {
|
type PublicKey struct {
|
||||||
Id string
|
Id string
|
||||||
|
@ -16,8 +18,8 @@ type Attachment struct {
|
||||||
|
|
||||||
type Media struct {
|
type Media struct {
|
||||||
Type string
|
Type string
|
||||||
MediaType *string
|
|
||||||
Url string
|
Url string
|
||||||
|
MediaType *string
|
||||||
Sensitive *bool
|
Sensitive *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,3 +77,156 @@ func (m Media) Marshal() map[string]any {
|
||||||
|
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParsePublicKey(_ map[string]any) (PublicKey, error) {
|
||||||
|
return PublicKey{}, NotImplementedError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseAttachment(raw map[string]any) (*Attachment, error) {
|
||||||
|
attachment := Attachment{}
|
||||||
|
rawType, ok := raw[KEY_VALUE]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_VALUE}
|
||||||
|
}
|
||||||
|
types, ok := rawType.([]string)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]string]{KEY_VALUE, rawType, []string{}}
|
||||||
|
}
|
||||||
|
if len(types) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_VALUE, 1, len(types)}
|
||||||
|
}
|
||||||
|
attachment.Type = types[0]
|
||||||
|
|
||||||
|
rawValueWrapper, ok := raw[KEY_SCHEMA_VALUE]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_SCHEMA_VALUE}
|
||||||
|
}
|
||||||
|
valueWrapper, ok := rawValueWrapper.([]map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]map[string]any]{
|
||||||
|
KEY_SCHEMA_VALUE,
|
||||||
|
rawValueWrapper,
|
||||||
|
[]map[string]any{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(valueWrapper) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_SCHEMA_VALUE, 1, len(types)}
|
||||||
|
}
|
||||||
|
rawValue, ok := valueWrapper[0][KEY_VALUE]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredSubFieldError{KEY_SCHEMA_VALUE, KEY_VALUE}
|
||||||
|
}
|
||||||
|
value, ok := rawValue.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[string]{KEY_VALUE, rawValue, ""}
|
||||||
|
}
|
||||||
|
attachment.Value = value
|
||||||
|
|
||||||
|
rawNameWrapper, ok := raw[KEY_ACTIVITYSTREAMS_NAME]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_NAME}
|
||||||
|
}
|
||||||
|
nameWrapper, ok := rawNameWrapper.([]map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]map[string]any]{
|
||||||
|
KEY_ACTIVITYSTREAMS_NAME,
|
||||||
|
rawNameWrapper,
|
||||||
|
[]map[string]any{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(nameWrapper) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_NAME, 1, len(nameWrapper)}
|
||||||
|
}
|
||||||
|
rawName, ok := valueWrapper[0][KEY_VALUE]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredSubFieldError{KEY_ACTIVITYSTREAMS_NAME, KEY_VALUE}
|
||||||
|
}
|
||||||
|
name, ok := rawName.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[string]{KEY_VALUE, rawValue, ""}
|
||||||
|
}
|
||||||
|
attachment.Name = name
|
||||||
|
|
||||||
|
return &attachment, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseMedia(raw map[string]any) (*Media, error) {
|
||||||
|
rawType, ok := raw[KEY_TYPE]
|
||||||
|
if !ok {
|
||||||
|
return nil, NoRequiredFieldError{KEY_TYPE}
|
||||||
|
}
|
||||||
|
typeValues, ok := rawType.([]string)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[[]string]{KEY_TYPE, rawType, typeValues}
|
||||||
|
}
|
||||||
|
if len(typeValues) != 1 {
|
||||||
|
return nil, BadFieldArrayLengthError{KEY_TYPE, 1, len(typeValues)}
|
||||||
|
}
|
||||||
|
typeValue := typeValues[0]
|
||||||
|
urlId, err := ParseIdTypeWithName(raw, nil, KEY_ACTIVITYSTREAMS_URL)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
media := Media{
|
||||||
|
Type: typeValue,
|
||||||
|
Url: urlId.Id,
|
||||||
|
}
|
||||||
|
|
||||||
|
if rawSensitiveData1, ok := raw[KEY_ACTIVITYSTREAMS_SENSITIVE]; ok {
|
||||||
|
if sensitiveData1, ok := rawSensitiveData1.([]map[string]any); ok &&
|
||||||
|
len(sensitiveData1) == 1 {
|
||||||
|
if v, err := ParseValueValue[bool](sensitiveData1[0]); err == nil {
|
||||||
|
media.Sensitive = &v.Value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if rawMediatypeData1, ok := raw[KEY_ACTIVITYSTREAMS_MEDIATYPE]; ok {
|
||||||
|
if mediatypeData1, ok := rawMediatypeData1.([]map[string]any); ok &&
|
||||||
|
len(mediatypeData1) == 1 {
|
||||||
|
if v, err := ParseValueValue[string](mediatypeData1[0]); err == nil {
|
||||||
|
media.MediaType = &v.Value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &media, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseIdValue(_ map[string]any) (IdValue, error) {
|
||||||
|
return IdValue{}, NotImplementedError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseValueValue[T any](raw map[string]any) (*ValueValue[T], error) {
|
||||||
|
otherData := map[string]any{}
|
||||||
|
var typeString *string = nil
|
||||||
|
var rawValue any = nil
|
||||||
|
valSet := false
|
||||||
|
for k, v := range raw {
|
||||||
|
switch k {
|
||||||
|
case KEY_VALUE:
|
||||||
|
valSet = true
|
||||||
|
rawValue = v
|
||||||
|
case KEY_TYPE:
|
||||||
|
parsed, ok := v.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[string]{KEY_TYPE, v, ""}
|
||||||
|
}
|
||||||
|
typeString = &parsed
|
||||||
|
default:
|
||||||
|
otherData[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !valSet {
|
||||||
|
return nil, NoRequiredFieldError{KEY_VALUE}
|
||||||
|
}
|
||||||
|
val, ok := rawValue.(T)
|
||||||
|
if !ok {
|
||||||
|
return nil, BadFieldValueError[T]{KEY_VALUE, rawValue, val}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &ValueValue[T]{
|
||||||
|
Value: val,
|
||||||
|
Type: typeString,
|
||||||
|
OtherThings: otherData,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue