Fix gob encoding the URL

This commit is contained in:
Marius Orcsik 2022-03-19 20:25:59 +01:00
parent 93a9596849
commit 79c0987785
No known key found for this signature in database
GPG key ID: DBF5E47F5DBC4D21
3 changed files with 22 additions and 8 deletions

View file

@ -68,6 +68,19 @@ func gobEncodeItems(col ItemCollection) ([]byte, error) {
return b.Bytes(), err
}
func gobEncodeItemOrLink(it LinkOrIRI) ([]byte, error) {
if ob, ok := it.(Item); ok {
return gobEncodeItem(ob)
}
b := bytes.Buffer{}
err := OnLink(it, func(l *Link) error {
bytes, err := l.GobEncode()
b.Write(bytes)
return err
})
return b.Bytes(), err
}
func gobEncodeItem(it Item) ([]byte, error) {
if IsIRI(it) {
if i, ok := it.(IRI); ok {
@ -97,6 +110,7 @@ func gobEncodeItem(it Item) ([]byte, error) {
return err
})
case LinkType, MentionType:
// TODO(marius): this shouldn't work, as Link does not implement Item? (or rather, should not)
err = OnLink(it, func(l *Link) error {
bytes, err := l.GobEncode()
b.Write(bytes)
@ -333,7 +347,7 @@ func mapObjectProperties(mm map[string][]byte, o *Object) (hasData bool, err err
hasData = true
}
if o.URL != nil {
if mm["url"], err = gobEncodeItem(o.URL); err != nil {
if mm["url"], err = gobEncodeItemOrLink(o.URL); err != nil {
return hasData, err
}
hasData = true

View file

@ -41,7 +41,7 @@ type WithOrderedCollectionPageFn func(*OrderedCollectionPage) error
type WithItemCollectionFn func(*ItemCollection) error
// OnLink calls function fn on it Item if it can be asserted to type Link
func OnLink(it Item, fn WithLinkFn) error {
func OnLink(it LinkOrIRI, fn WithLinkFn) error {
if it == nil {
return nil
}

View file

@ -135,10 +135,10 @@ func (a ActivityVocabularyType) MarshalBinary() ([]byte, error) {
type Objects interface {
Object | Tombstone | Place | Profile | Relationship |
Activities |
IntransitiveActivities |
Collections |
IRI
Activities |
IntransitiveActivities |
Collections |
IRI
}
// Object describes an ActivityPub object of any kind.
@ -427,14 +427,14 @@ func (m MimeType) MarshalBinary() ([]byte, error) {
}
// ToLink returns a Link pointer to the data in the current Item
func ToLink(it Item) (*Link, error) {
func ToLink(it LinkOrIRI) (*Link, error) {
switch i := it.(type) {
case *Link:
return i, nil
case Link:
return &i, nil
}
return nil, fmt.Errorf("unable to convert %q", it.GetType())
return nil, fmt.Errorf("unable to convert %T", it)
}
// ToObject returns an Object pointer to the data in the current Item