func (u *user) state(now time.Time, f gregor.ObjFactory, d gregor.DeviceID, t gregor.TimeOrOffset) (gregor.State, error) { var items []gregor.Item table := make(map[string]gregor.Item) for _, i := range u.items { md := i.item.Metadata() did := md.DeviceID() if d != nil && did != nil && !bytes.Equal(did.Bytes(), d.Bytes()) { continue } if t != nil && toTime(now, t).Before(i.ctime) { continue } if i.isDismissedAt(toTime(now, t)) { continue } exported, err := i.export(f) if err != nil { return nil, err } items = append(items, exported) table[exported.Metadata().MsgID().String()] = exported } return f.MakeStateWithLookupTable(items, table) }
// export the item i to a generic gregor.Item interface. Basically just return // the object we got, but if there was no CTime() on the incoming message, // then use the ctime we stamped on the message when it arrived. func (i item) export(f gregor.ObjFactory) (gregor.Item, error) { md := i.item.Metadata() return f.MakeItem(md.UID(), md.MsgID(), md.DeviceID(), i.ctime, i.item.Category(), i.dtime, i.item.Body()) }