208 lines
4.8 KiB
Go
208 lines
4.8 KiB
Go
|
|
package pana
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"iter"
|
||
|
|
|
||
|
|
ld "sourcery.dny.nu/longdistance"
|
||
|
|
"sourcery.dny.nu/pana/vocab/mastodon"
|
||
|
|
as "sourcery.dny.nu/pana/vocab/w3/activitystreams"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Question is the ActivityStreams Question object.
|
||
|
|
type Question IntransitiveActivity
|
||
|
|
|
||
|
|
// NewQuestion initialises a new Question.
|
||
|
|
func NewQuestion() *Question {
|
||
|
|
return &Question{
|
||
|
|
Properties: make(ld.Properties),
|
||
|
|
Type: []string{as.TypeQuestion},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Build finalises the Question.
|
||
|
|
//
|
||
|
|
// This returns [Any] since that's what [Activity.SetObject] expects.
|
||
|
|
func (q *Question) Build() Any {
|
||
|
|
return Any(*q)
|
||
|
|
}
|
||
|
|
|
||
|
|
// IsMultipleChoice checks if this is a multiple-choice question.
|
||
|
|
func (q *Question) IsMultipleChoice() bool {
|
||
|
|
if q == nil {
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
|
||
|
|
return Has((*Any)(q), as.AnyOf)
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.GetType].
|
||
|
|
func (q *Question) GetType() string {
|
||
|
|
return (*Object)(q).GetType()
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetType sets the type to [as.TypeQuestion].
|
||
|
|
func (q *Question) SetType() {
|
||
|
|
q.Type = []string{as.TypeQuestion}
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetVotersCount returns the value in [mastodon.VotersCount].
|
||
|
|
//
|
||
|
|
// See https://docs.joinmastodon.org/spec/activitypub/#toot.
|
||
|
|
func (q *Question) GetVotersCount() json.RawMessage {
|
||
|
|
if nodes := (*ld.Node)(q).GetNodes(mastodon.VotersCount); len(nodes) == 1 {
|
||
|
|
return nodes[0].Value
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetVotersCount sets the value in [mastodon.VotersCount].
|
||
|
|
func (q *Question) SetVotersCount(v json.RawMessage) *Question {
|
||
|
|
(*ld.Node)(q).SetNodes(mastodon.VotersCount, ld.Node{Value: v})
|
||
|
|
return q
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetEndTime returns the value in [as.EndTime].
|
||
|
|
//
|
||
|
|
// See https://www.w3.org/TR/activitystreams-vocabulary/#dfn-endtime.
|
||
|
|
func (q *Question) GetEndTime() json.RawMessage {
|
||
|
|
if nodes := (*ld.Node)(q).GetNodes(as.EndTime); len(nodes) == 1 {
|
||
|
|
return nodes[0].Value
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetEndTime sets the value in [as.EndTime].
|
||
|
|
func (q *Question) SetEndTime(v json.RawMessage) *Question {
|
||
|
|
(*ld.Node)(q).SetNodes(as.EndTime, ld.Node{Value: v})
|
||
|
|
return q
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.GetSensitive].
|
||
|
|
func (q *Question) GetSensitive() json.RawMessage {
|
||
|
|
return (*Object)(q).GetSensitive()
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.SetSensitive].
|
||
|
|
func (q *Question) SetSensitive(v json.RawMessage) *Question {
|
||
|
|
(*Object)(q).SetSensitive(v)
|
||
|
|
return q
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.GetUpdated].
|
||
|
|
func (q *Question) GetUpdated() json.RawMessage {
|
||
|
|
return (*Object)(q).GetUpdated()
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.SetUpdated].
|
||
|
|
func (q *Question) SetUpdated(v json.RawMessage) *Question {
|
||
|
|
(*Object)(q).SetUpdated(v)
|
||
|
|
return q
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetAnyOf gets the [Choice] in [as.AnyOf].
|
||
|
|
//
|
||
|
|
// See https://www.w3.org/TR/activitystreams-vocabulary/#dfn-oneof.
|
||
|
|
func (q *Question) GetAnyOf() iter.Seq[Choice] {
|
||
|
|
return func(yield func(Choice) bool) {
|
||
|
|
for _, n := range (*ld.Node)(q).GetNodes(as.AnyOf) {
|
||
|
|
if !yield(Choice(n)) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// AddAnyOf appends [Choice] to [as.AnyOf].
|
||
|
|
func (q *Question) AddAnyOf(chs ...Choice) *Question {
|
||
|
|
(*ld.Node)(q).AddNodes(as.AnyOf, toLDNodes(chs...)...)
|
||
|
|
return q
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetOneOf gets the [Choice] in [as.OneOf].
|
||
|
|
//
|
||
|
|
// See https://www.w3.org/TR/activitystreams-vocabulary/#dfn-oneof.
|
||
|
|
func (q *Question) GetOneOf() iter.Seq[Choice] {
|
||
|
|
return func(yield func(Choice) bool) {
|
||
|
|
for _, n := range (*ld.Node)(q).GetNodes(as.OneOf) {
|
||
|
|
if !yield(Choice(n)) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// AddOneOf appends [Choice] to [as.OneOf].
|
||
|
|
func (q *Question) AddOneOf(chs ...Choice) *Question {
|
||
|
|
(*ld.Node)(q).AddNodes(as.OneOf, toLDNodes(chs...)...)
|
||
|
|
return q
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetClosed returns the value in [as.Closed].
|
||
|
|
//
|
||
|
|
// See https://www.w3.org/TR/activitystreams-vocabulary/#dfn-closed.
|
||
|
|
func (q *Question) GetClosed() json.RawMessage {
|
||
|
|
if nodes := (*ld.Node)(q).GetNodes(as.Closed); len(nodes) == 1 {
|
||
|
|
return nodes[0].Value
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetClosed sets the value in [as.Closed].
|
||
|
|
func (q *Question) SetClosed(v json.RawMessage) *Question {
|
||
|
|
(*ld.Node)(q).SetNodes(as.Closed, ld.Node{Value: v})
|
||
|
|
return q
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.GetName].
|
||
|
|
func (q *Question) GetName() iter.Seq[*Localised] {
|
||
|
|
return (*Object)(q).GetName()
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.AddName].
|
||
|
|
func (q *Question) AddName(ls ...Localised) *Question {
|
||
|
|
(*Object)(q).AddName(ls...)
|
||
|
|
return q
|
||
|
|
}
|
||
|
|
|
||
|
|
// Choice represents a choice in a poll. It is a much more limited [Note].
|
||
|
|
type Choice Note
|
||
|
|
|
||
|
|
// NewChoice initialises a new Choice.
|
||
|
|
func NewChoice() *Choice {
|
||
|
|
return &Choice{
|
||
|
|
Properties: make(ld.Properties),
|
||
|
|
Type: []string{as.TypeNote},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Build finalises the Choice.
|
||
|
|
func (c *Choice) Build() Choice {
|
||
|
|
return *c
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.GetName].
|
||
|
|
func (c *Choice) GetName() iter.Seq[*Localised] {
|
||
|
|
return (*Object)(c).GetName()
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.AddName].
|
||
|
|
func (c *Choice) AddName(ls ...Localised) *Choice {
|
||
|
|
(*Object)(c).AddName(ls...)
|
||
|
|
return c
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.GetReplies].
|
||
|
|
func (c *Choice) GetReplies() *Collection {
|
||
|
|
return (*Object)(c).GetReplies()
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.SetReplies].
|
||
|
|
func (c *Choice) SetReplies(cl Collection) *Choice {
|
||
|
|
(*Object)(c).SetReplies(cl)
|
||
|
|
return c
|
||
|
|
}
|