twink/vendor/sourcery.dny.nu/pana/link.go

199 lines
4.4 KiB
Go
Raw Permalink Normal View History

2025-12-05 12:20:05 +01:00
package pana
import (
"encoding/json"
"iter"
ld "sourcery.dny.nu/longdistance"
as "sourcery.dny.nu/pana/vocab/w3/activitystreams"
)
// Link is the ActivityStreams Link type.
//
// Though Link can have an ID, this never happens in practice because the target
// of a link is stored in [as.Href] instead.
type Link ld.Node
// NewLink initialises a new Link.
func NewLink() *Link {
return &Link{
Properties: make(ld.Properties),
Type: []string{as.TypeLink},
}
}
// Build finalises the Link.
func (l *Link) Build() Link {
return *l
}
// See [Object.GetType].
//
// This will most commonly be one of:
// - [as.TypeLink]
// - [as.TypeDocument]
// - [as.TypeImage]
// - [as.TypeAudio]
// - [as.TypeVideo]
// - [as.TypeMention]
// - [as.TypeHashtag]
//
// You'll probably want to use [LinkTag] for Mention and Hashtag.
func (l *Link) GetType() string {
if l.Type == nil {
return ""
}
return l.Type[0]
}
// See [Object.SetType].
func (l *Link) SetType(t string) *Link {
l.Type = []string{t}
return l
}
// GetHref returns the value from [as.Href].
func (l *Link) GetHref() string {
if nodes := (*ld.Node)(l).GetNodes(as.Href); len(nodes) == 1 {
return nodes[0].ID
}
return ""
}
// SetHref sets a URL in [as.Href].
func (l *Link) SetHref(url string) *Link {
(*ld.Node)(l).SetNodes(as.Href, ld.Node{ID: url})
return l
}
// GetName returns the value from [as.Name].
func (l *Link) GetName() iter.Seq[*Localised] {
return func(yield func(*Localised) bool) {
for _, n := range (*ld.Node)(l).GetNodes(as.Name) {
if !yield((*Localised)(&n)) {
return
}
}
}
}
// SetName sets a value in [as.Name].
func (l *Link) AddName(ls ...Localised) *Link {
(*ld.Node)(l).AddNodes(as.Name, toLDNodes(ls...)...)
return l
}
// GetHreflang returns the value from [as.Hreflang].
func (l *Link) GetHreflang() json.RawMessage {
if nodes := (*ld.Node)(l).GetNodes(as.Hreflang); len(nodes) == 1 {
return nodes[0].Value
}
return nil
}
// SetHreflang sets a value in [as.Hreflang].
func (l *Link) SetHreflang(hreflang json.RawMessage) *Link {
(*ld.Node)(l).SetNodes(as.Hreflang, ld.Node{Value: hreflang})
return l
}
// GetMediaType returns the value from [as.MediaType].
func (l *Link) GetMediaType() json.RawMessage {
if nodes := (*ld.Node)(l).GetNodes(as.MediaType); len(nodes) == 1 {
return nodes[0].Value
}
return nil
}
// SetMediaType sets a value in [as.MediaType].
func (l *Link) SetMediaType(mediaType json.RawMessage) *Link {
(*ld.Node)(l).SetNodes(as.MediaType, ld.Node{Value: mediaType})
return l
}
// GetRel returns the value from [as.Rel].
func (l *Link) GetRel() json.RawMessage {
if nodes := (*ld.Node)(l).GetNodes(as.Rel); len(nodes) == 1 {
return nodes[0].Value
}
return nil
}
// SetRel sets a value in [as.Rel].
func (l *Link) SetRel(rel json.RawMessage) *Link {
(*ld.Node)(l).SetNodes(as.Rel, ld.Node{Value: rel})
return l
}
// GetHeight returns the value from [as.Height].
func (l *Link) GetHeight() json.RawMessage {
if nodes := (*ld.Node)(l).GetNodes(as.Height); len(nodes) == 1 {
return nodes[0].Value
}
return nil
}
// SetHeight sets a value in [as.Height].
func (l *Link) SetHeight(height json.RawMessage) *Link {
(*ld.Node)(l).SetNodes(as.Height, ld.Node{Value: height})
return l
}
// GetWidth returns the value from [as.Width].
func (l *Link) GetWidth() json.RawMessage {
if nodes := (*ld.Node)(l).GetNodes(as.Width); len(nodes) == 1 {
return nodes[0].Value
}
return nil
}
// SetWidth sets a value in [as.Width].
func (l *Link) SetWidth(width json.RawMessage) *Link {
(*ld.Node)(l).SetNodes(as.Width, ld.Node{Value: width})
return l
}
// LinkTag is a more constrained version of [Link] that is used in [as.Tag].
//
// It's usually used to represent hashtags and mentions.
type LinkTag Link
func NewLinkTag() *LinkTag {
return &LinkTag{
Properties: make(ld.Properties, 2),
}
}
// See [Link.GetType].
func (l *LinkTag) GetType() string {
return (*Link)(l).GetType()
}
// See [Link.SetType].
func (l *LinkTag) SetType(t string) *LinkTag {
(*Link)(l).SetType(t)
return l
}
// See [Link.GetHref]
func (l *LinkTag) GetHref() string {
return (*Link)(l).GetHref()
}
// See [Link.SetHref].
func (l *LinkTag) SetHref(url string) *LinkTag {
(*Link)(l).SetHref(url)
return l
}
// See [Link.GetName].
func (l *LinkTag) GetName() iter.Seq[*Localised] {
return (*Link)(l).GetName()
}
// See [Link.AddName].
func (l *LinkTag) AddName(ls ...Localised) *LinkTag {
(*Link)(l).AddName(ls...)
return l
}