Changes
7 changed files (+220/-111)
-
-
@@ -279,40 +279,6 @@ func (c *Collection) UnmarshalJSON(data []byte) error {return nil } // Flatten checks if Item can be flatten to an IRI or array of IRIs and returns it if so func Flatten(it Item) Item { if it.IsCollection() { if c, ok := it.(CollectionInterface); ok { it = FlattenItemCollection(c.Collection()) } } if it != nil && len(it.GetLink()) > 0 { return it.GetLink() } return it } // FlattenItemCollection flattens the Collection's properties from Object type to IRI func FlattenItemCollection(c ItemCollection) ItemCollection { if c != nil && len(c) > 0 { for i, it := range c { c[i] = FlattenToIRI(it) } } return c } // ToItemCollection func ToItemCollection(it Item) (*ItemCollection, error) { switch i := it.(type) { case *ItemCollection: return i, nil case ItemCollection: return &i, nil } return nil, errors.New("unable to convert to item collection") } // ToCollection func ToCollection(it Item) (*Collection, error) { switch i := it.(type) {
-
-
-
@@ -267,7 +267,38 @@ func CollectionPageNew(parent CollectionInterface) *CollectionPage {} func copyCollectionToPage(c *Collection, p *CollectionPage) error { p.ID = c.ID p.Type = CollectionPageType p.Name = c.Name p.Content = c.Content p.Summary = c.Summary p.Context = c.Context p.URL = c.URL p.MediaType = c.MediaType p.Generator = c.Generator p.AttributedTo = c.AttributedTo p.Attachment = c.Attachment p.Location = c.Location p.Published = c.Published p.StartTime = c.StartTime p.EndTime = c.EndTime p.Duration = c.Duration p.Icon = c.Icon p.Preview = c.Preview p.Image = c.Image p.Updated = c.Updated p.InReplyTo = c.InReplyTo p.To = c.To p.Audience = c.Audience p.Bto = c.Bto p.CC = c.CC p.BCC = c.BCC p.Replies = c.Replies p.Tag = c.Tag p.TotalItems = c.TotalItems p.Items = c.Items p.Current = c.Current p.First = c.First p.PartOf = c.GetLink() return nil }
-
-
-
@@ -169,4 +169,3 @@ func TestToCollection(t *testing.T) {func TestCollection_Contains(t *testing.T) { t.Skipf("TODO") }
-
-
-
@@ -1,84 +1,20 @@package activitypub // ItemCollection represents an array of items type ItemCollection []Item // Item struct type Item ObjectOrLink const EmptyObjectID = ObjectID("") const EmptyIRI = IRI("") // GetID returns the ObjectID corresponding to ItemCollection func (i ItemCollection) GetID() ObjectID { return EmptyObjectID } // GetLink returns the empty IRI func (i ItemCollection) GetLink() IRI { return EmptyIRI } // GetType returns the ItemCollection's type func (i ItemCollection) GetType() ActivityVocabularyType { return CollectionOfItems } // IsLink returns false for an ItemCollection object func (i ItemCollection) IsLink() bool { return false } // IsObject returns true for a ItemCollection object func (i ItemCollection) IsObject() bool { return false } // Append facilitates adding elements to Item arrays // and ensures ItemCollection implements the Collection interface func (i *ItemCollection) Append(o Item) error { oldLen := len(*i) d := make(ItemCollection, oldLen+1) for k, it := range *i { d[k] = it } d[oldLen] = o *i = d return nil } // Count returns the length of Items in the item collection func (i *ItemCollection) Count() uint { return uint(len(*i)) } // First returns the ObjectID corresponding to ItemCollection func (i ItemCollection) First() Item { if len(i) == 0 { return nil } return i[0] } // Collection returns the current object as collection interface func (i *ItemCollection) Collection() ItemCollection { return *i } // IsCollection returns true for ItemCollection arrays func (i ItemCollection) IsCollection() bool { return true } // Contains verifies if IRIs array contains the received one func (i ItemCollection) Contains(r IRI) bool { if len(i) == 0 { return false } for _, iri := range i { if r.Equals(iri.GetLink(), false) { return true // Flatten checks if Item can be flatten to an IRI or array of IRIs and returns it if so func Flatten(it Item) Item { if it.IsCollection() { if c, ok := it.(CollectionInterface); ok { it = FlattenItemCollection(c.Collection()) } } return false if it != nil && len(it.GetLink()) > 0 { return it.GetLink() } return it }
-
-
item_collection.go (new)
-
@@ -0,0 +1,147 @@package activitypub import ( "errors" "sort" ) // ItemCollection represents an array of items type ItemCollection []Item // GetID returns the ObjectID corresponding to ItemCollection func (i ItemCollection) GetID() ObjectID { return EmptyObjectID } // GetLink returns the empty IRI func (i ItemCollection) GetLink() IRI { return EmptyIRI } // GetType returns the ItemCollection's type func (i ItemCollection) GetType() ActivityVocabularyType { return CollectionOfItems } // IsLink returns false for an ItemCollection object func (i ItemCollection) IsLink() bool { return false } // IsObject returns true for a ItemCollection object func (i ItemCollection) IsObject() bool { return false } // Append facilitates adding elements to Item arrays // and ensures ItemCollection implements the Collection interface func (i *ItemCollection) Append(o Item) error { oldLen := len(*i) d := make(ItemCollection, oldLen+1) for k, it := range *i { d[k] = it } d[oldLen] = o *i = d return nil } // Count returns the length of Items in the item collection func (i *ItemCollection) Count() uint { return uint(len(*i)) } // First returns the ObjectID corresponding to ItemCollection func (i ItemCollection) First() Item { if len(i) == 0 { return nil } return i[0] } // Collection returns the current object as collection interface func (i *ItemCollection) Collection() ItemCollection { return *i } // IsCollection returns true for ItemCollection arrays func (i ItemCollection) IsCollection() bool { return true } // Contains verifies if IRIs array contains the received one func (i ItemCollection) Contains(r IRI) bool { if len(i) == 0 { return false } for _, iri := range i { if r.Equals(iri.GetLink(), false) { return true } } return false } // ItemCollectionDeduplication normalizes the received arguments lists into a single unified one func ItemCollectionDeduplication(recCols ...*ItemCollection) (ItemCollection, error) { rec := make(ItemCollection, 0) for _, recCol := range recCols { if recCol == nil { continue } toRemove := make([]int, 0) for i, cur := range *recCol { save := true if cur == nil { continue } var testIt IRI if cur.IsObject() { testIt = IRI(cur.GetID()) } else if cur.IsLink() { testIt = cur.GetLink() } else { continue } for _, it := range rec { if testIt.Equals(IRI(it.GetID()), false) { // mark the element for removal toRemove = append(toRemove, i) save = false } } if save { rec = append(rec, testIt) } } sort.Sort(sort.Reverse(sort.IntSlice(toRemove))) for _, idx := range toRemove { *recCol = append((*recCol)[:idx], (*recCol)[idx+1:]...) } } return rec, nil } // FlattenItemCollection flattens the Collection's properties from Object type to IRI func FlattenItemCollection(c ItemCollection) ItemCollection { if c != nil && len(c) > 0 { for i, it := range c { c[i] = FlattenToIRI(it) } } return c } // ToItemCollection func ToItemCollection(it Item) (*ItemCollection, error) { switch i := it.(type) { case *ItemCollection: return i, nil case ItemCollection: return &i, nil } return nil, errors.New("unable to convert to item collection") }
-
-
-
@@ -272,6 +272,37 @@ func ToOrderedCollection(it Item) (*OrderedCollection, error) {} func copyOrderedCollectionToPage(c *OrderedCollection, p *OrderedCollectionPage) error { p.ID = c.ID p.Type = OrderedCollectionPageType p.Name = c.Name p.Content = c.Content p.Summary = c.Summary p.Context = c.Context p.URL = c.URL p.MediaType = c.MediaType p.Generator = c.Generator p.AttributedTo = c.AttributedTo p.Attachment = c.Attachment p.Location = c.Location p.Published = c.Published p.StartTime = c.StartTime p.EndTime = c.EndTime p.Duration = c.Duration p.Icon = c.Icon p.Preview = c.Preview p.Image = c.Image p.Updated = c.Updated p.InReplyTo = c.InReplyTo p.To = c.To p.Audience = c.Audience p.Bto = c.Bto p.CC = c.CC p.BCC = c.BCC p.Replies = c.Replies p.Tag = c.Tag p.TotalItems = c.TotalItems p.OrderedItems = c.OrderedItems p.Current = c.Current p.First = c.First p.PartOf = c.GetLink() return nil }
-
-
-
@@ -34,7 +34,6 @@ func Test_OrderedCollection_Append(t *testing.T) {} } func TestOrderedCollection_Append(t *testing.T) { id := ObjectID("test")
-