package itemevents import ( "sort" "gitea.maximumdirect.net/eric/notarius/internal/core/source" "gitea.maximumdirect.net/eric/notarius/internal/modules/dnd" "gitea.maximumdirect.net/eric/notarius/internal/modules/dnd/shared" ) type orderedItemEventResponse struct { value itemEventResponse earliest int hasEvidence bool } func canonicalizeResponse(response *extractionResponse, order shared.SourceRefOrder, sourceID string) { if response == nil { return } ordered := make([]orderedItemEventResponse, len(response.Events)) for index := range response.Events { earliest, hasEvidence := canonicalizeItemEvent(&response.Events[index], order, sourceID) ordered[index] = orderedItemEventResponse{ value: response.Events[index], earliest: earliest, hasEvidence: hasEvidence, } } sort.SliceStable(ordered, func(left, right int) bool { if ordered[left].hasEvidence != ordered[right].hasEvidence { return ordered[left].hasEvidence } if !ordered[left].hasEvidence { return false } return ordered[left].earliest < ordered[right].earliest }) for index := range ordered { response.Events[index] = ordered[index].value } } func canonicalizeItemEvent(event *itemEventResponse, order shared.SourceRefOrder, sourceID string) (int, bool) { if event == nil { return 0, false } refs := order.Canonicalize(itemEventSourceRefs(event.SourceRefs, sourceID)) event.SourceRefs = itemEventResponseRefs(refs) return order.EarliestValid(refs) } func canonicalItemEventList(response extractionResponse, sourceID string) dnd.ItemEventList { if response.Events == nil { return dnd.ItemEventList{} } events := make([]dnd.ItemEvent, len(response.Events)) for index, event := range response.Events { events[index] = dnd.ItemEvent{ Name: event.Name, Kind: dnd.ItemEventKind(event.Kind), Quantity: cloneQuantity(event.Quantity), From: event.From, To: event.To, SourceRefs: itemEventSourceRefs(event.SourceRefs, sourceID), } } return dnd.ItemEventList{Events: events} } func itemEventSourceRefs(refs []itemEventSourceRefResponse, sourceID string) []source.SourceRef { if refs == nil { return nil } values := make([]source.SourceRef, len(refs)) for index, ref := range refs { values[index] = source.SourceRef{SourceID: sourceID, StartUnitID: ref.StartSegment, EndUnitID: ref.EndSegment} } return values } func itemEventResponseRefs(refs []source.SourceRef) []itemEventSourceRefResponse { if refs == nil { return nil } values := make([]itemEventSourceRefResponse, len(refs)) for index, ref := range refs { values[index] = itemEventSourceRefResponse{StartSegment: ref.StartUnitID, EndSegment: ref.EndUnitID} } return values } func cloneQuantity(value *int) *int { if value == nil { return nil } quantity := *value return &quantity }