package model import ( "fmt" "github.com/robertjanetzko/LegendsBrowser2/backend/util" ) type HistoricalEventDetails interface { RelatedToEntity(int) bool RelatedToHf(int) bool RelatedToArtifact(int) bool RelatedToSite(int) bool RelatedToStructure(int, int) bool RelatedToRegion(int) bool Html(*Context) string Type() string } type HistoricalEventCollectionDetails interface { Type() string Html(*HistoricalEventCollection, *Context) string } type EventList struct { Events []*HistoricalEvent Context *Context } func NewEventList(world *DfWorld, obj any) *EventList { el := EventList{ Context: &Context{ World: world, HfId: -1, }, } switch x := obj.(type) { case *Entity: el.Events = world.EventsMatching(func(d HistoricalEventDetails) bool { return d.RelatedToEntity(x.Id()) }) case *HistoricalFigure: el.Context.HfId = x.Id() el.Events = world.EventsMatching(func(d HistoricalEventDetails) bool { return d.RelatedToHf(x.Id()) }) case *Artifact: el.Context.HfId = x.HolderHfid el.Events = world.EventsMatching(func(d HistoricalEventDetails) bool { return d.RelatedToArtifact(x.Id()) }) case *Site: el.Events = world.EventsMatching(func(d HistoricalEventDetails) bool { return d.RelatedToSite(x.Id()) }) case *Structure: el.Events = world.EventsMatching(func(d HistoricalEventDetails) bool { return d.RelatedToStructure(x.SiteId, x.Id()) }) case *Region: el.Events = world.EventsMatching(func(d HistoricalEventDetails) bool { return d.RelatedToRegion(x.Id()) }) case []*HistoricalEvent: el.Events = x case []int: el.Events = util.Map(x, func(id int) *HistoricalEvent { return world.HistoricalEvents[id] }) default: fmt.Printf("unknown type %T\n", obj) } return &el }