twink/vendor/sourcery.dny.nu/pana/question.go
2025-12-05 12:20:05 +01:00

207 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
}