Adopt registry-backed item occurrences

This commit is contained in:
2026-08-05 19:55:34 +00:00
parent f91237e9c0
commit 3dfefd0e14
46 changed files with 996 additions and 1034 deletions

View File

@@ -5,11 +5,12 @@ import (
"gitea.maximumdirect.net/eric/notarius/internal/core/source"
"gitea.maximumdirect.net/eric/notarius/internal/modules/dnd"
itemregistry "gitea.maximumdirect.net/eric/notarius/internal/modules/dnd/items/registry"
"gitea.maximumdirect.net/eric/notarius/internal/modules/dnd/shared"
)
type orderedItemEventResponse struct {
value itemEventResponse
type orderedItemOccurrenceResponse struct {
value itemOccurrenceResponse
earliest int
hasEvidence bool
}
@@ -18,11 +19,11 @@ func canonicalizeResponse(response *extractionResponse, order shared.SourceRefOr
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],
ordered := make([]orderedItemOccurrenceResponse, len(response.Occurrences))
for index := range response.Occurrences {
earliest, hasEvidence := canonicalizeItemOccurrence(&response.Occurrences[index], order, sourceID)
ordered[index] = orderedItemOccurrenceResponse{
value: response.Occurrences[index],
earliest: earliest,
hasEvidence: hasEvidence,
}
@@ -37,38 +38,43 @@ func canonicalizeResponse(response *extractionResponse, order shared.SourceRefOr
return ordered[left].earliest < ordered[right].earliest
})
for index := range ordered {
response.Events[index] = ordered[index].value
response.Occurrences[index] = ordered[index].value
}
}
func canonicalizeItemEvent(event *itemEventResponse, order shared.SourceRefOrder, sourceID string) (int, bool) {
func canonicalizeItemOccurrence(event *itemOccurrenceResponse, order shared.SourceRefOrder, sourceID string) (int, bool) {
if event == nil {
return 0, false
}
refs := order.Canonicalize(itemEventSourceRefs(event.SourceRefs, sourceID))
event.SourceRefs = itemEventResponseRefs(refs)
refs := order.Canonicalize(itemOccurrenceSourceRefs(event.SourceRefs, sourceID))
event.SourceRefs = itemOccurrenceResponseRefs(refs)
return order.EarliestValid(refs)
}
func canonicalItemEventList(response extractionResponse, sourceID string) dnd.ItemEventList {
if response.Events == nil {
return dnd.ItemEventList{}
func canonicalItemOccurrenceList(response extractionResponse, sourceID string, registry *itemregistry.Registry) dnd.ItemOccurrenceList {
if response.Occurrences == nil {
return dnd.ItemOccurrenceList{}
}
events := make([]dnd.ItemEvent, len(response.Events))
for index, event := range response.Events {
events[index] = dnd.ItemEvent{
occurrences := make([]dnd.ItemOccurrence, 0, len(response.Occurrences))
for _, event := range response.Occurrences {
item, found := registry.LookupID(event.ItemID)
if !found || item.Name != event.Name {
continue
}
occurrences = append(occurrences, dnd.ItemOccurrence{
ItemID: event.ItemID,
Name: event.Name,
Kind: dnd.ItemEventKind(event.Kind),
Kind: dnd.ItemOccurrenceKind(event.Kind),
Quantity: cloneQuantity(event.Quantity),
From: event.From,
To: event.To,
SourceRefs: itemEventSourceRefs(event.SourceRefs, sourceID),
}
SourceRefs: itemOccurrenceSourceRefs(event.SourceRefs, sourceID),
})
}
return dnd.ItemEventList{Events: events}
return dnd.ItemOccurrenceList{Occurrences: occurrences}
}
func itemEventSourceRefs(refs []itemEventSourceRefResponse, sourceID string) []source.SourceRef {
func itemOccurrenceSourceRefs(refs []itemOccurrenceSourceRefResponse, sourceID string) []source.SourceRef {
if refs == nil {
return nil
}
@@ -79,13 +85,13 @@ func itemEventSourceRefs(refs []itemEventSourceRefResponse, sourceID string) []s
return values
}
func itemEventResponseRefs(refs []source.SourceRef) []itemEventSourceRefResponse {
func itemOccurrenceResponseRefs(refs []source.SourceRef) []itemOccurrenceSourceRefResponse {
if refs == nil {
return nil
}
values := make([]itemEventSourceRefResponse, len(refs))
values := make([]itemOccurrenceSourceRefResponse, len(refs))
for index, ref := range refs {
values[index] = itemEventSourceRefResponse{StartSegment: ref.StartUnitID, EndSegment: ref.EndUnitID}
values[index] = itemOccurrenceSourceRefResponse{StartSegment: ref.StartUnitID, EndSegment: ref.EndUnitID}
}
return values
}