Files

88 lines
2.6 KiB
Go

package itemregistry
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/items/identity"
"gitea.maximumdirect.net/eric/notarius/internal/modules/dnd/shared"
)
type orderedItemResponse struct {
value itemResponse
earliest int
hasEvidence bool
}
func canonicalizeResponse(response *extractionResponse, order shared.SourceRefOrder, sourceID string) {
if response == nil {
return
}
ordered := make([]orderedItemResponse, len(response.Items))
for index := range response.Items {
earliest, hasEvidence := canonicalizeItem(&response.Items[index], order, sourceID)
ordered[index] = orderedItemResponse{value: response.Items[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.Items[index] = ordered[index].value
}
}
func canonicalizeItem(item *itemResponse, order shared.SourceRefOrder, sourceID string) (int, bool) {
if item == nil {
return 0, false
}
item.Name = identity.NormalizeDisplay(item.Name)
refs := order.Canonicalize(canonicalSourceRefs(item.SourceRefs, sourceID))
item.SourceRefs = itemResponseRefs(refs)
return order.EarliestValid(refs)
}
func canonicalItemRegistry(response extractionResponse, sourceID string) dnd.ItemRegistry {
if response.Items == nil {
return dnd.ItemRegistry{Items: nil}
}
items := make([]dnd.Item, len(response.Items))
for index, item := range response.Items {
refs := canonicalSourceRefs(item.SourceRefs, sourceID)
items[index] = dnd.Item{
ID: identity.DeriveID(item.Name),
Name: item.Name,
SourceRefs: refs,
}
}
return dnd.ItemRegistry{Items: items}
}
func canonicalSourceRefs(values []itemSourceRefResponse, sourceID string) []source.SourceRef {
if values == nil {
return nil
}
refs := make([]source.SourceRef, len(values))
for index, value := range values {
refs[index] = source.SourceRef{SourceID: sourceID, StartUnitID: value.StartUnitID, EndUnitID: value.EndUnitID}
}
return refs
}
func itemResponseRefs(values []source.SourceRef) []itemSourceRefResponse {
if values == nil {
return nil
}
refs := make([]itemSourceRefResponse, len(values))
for index, value := range values {
refs[index] = itemSourceRefResponse{StartUnitID: value.StartUnitID, EndUnitID: value.EndUnitID}
}
return refs
}