package vote import ( "context" ) // OpinionGiver gives opinions about the given IDs. type OpinionGiver interface { // Query queries the OpinionGiver for its opinions on the given IDs. // The passed in context can be used to signal cancellation of the query. Query(ctx context.Context, ids []string) (Opinions, error) // ID returns the ID of the opinion giver. ID() string } // QueriedOpinions represents queried opinions from a given opinion giver. type QueriedOpinions struct { // The ID of the opinion giver. OpinionGiverID string `json:"opinion_giver_id"` // The map of IDs to opinions. Opinions map[string]Opinion `json:"opinions"` // The amount of times the opinion giver's opinion has counted. // Usually this number is 1 but due to randomization of the queried opinion givers, // the same opinion giver's opinions might be taken into account multiple times. TimesCounted int `json:"times_counted"` } // OpinionGiverFunc is a function which gives a slice of OpinionGivers or an error. type OpinionGiverFunc func() ([]OpinionGiver, error) // Opinions is a slice of Opinion. type Opinions []Opinion // Opinion is an opinion about a given thing. type Opinion byte const ( Like Opinion = 1 << 0 Dislike Opinion = 1 << 1 Unknown Opinion = 1 << 2 ) // ConvertInt32Opinion converts the given int32 to an Opinion. func ConvertInt32Opinion(x int32) Opinion { switch { case x == 1<<0: return Like case x == 1<<1: return Dislike } return Unknown }