package main import ( "encoding/json" "fmt" "sync/atomic" ) var queueEntryIDCounter atomic.Uint32 // NewQueueEntryID returns a unique document id. func NewQueueEntryID() QueueEntryID { return QueueEntryID(queueEntryIDCounter.Add(1)) } type QueueEntryID int // QueueEntry can contain a single or multiple scanned pages. type QueueEntry struct { ID QueueEntryID `json:"id"` Name string `json:"name"` QueueEntryData } func (q QueueEntry) MarshalJSON() ([]byte, error) { if q.QueueEntryData == nil { return nil, fmt.Errorf("queue entry doesn't contain any data") } type embedded QueueEntry // Prevent recursion. return json.Marshal( struct { embedded Type string `json:"type"` }{ embedded: embedded(q), Type: q.QueueEntryDataType(), }, ) }