diff --git a/providers/xmlprovider/library.go b/providers/xmlprovider/library.go new file mode 100644 index 0000000..67b4039 --- /dev/null +++ b/providers/xmlprovider/library.go @@ -0,0 +1,15 @@ +package xmlprovider + +import "sync" + +type Library struct { + pmux sync.Mutex + Parses []ParseMeta +} + +func (l *Library) Latest() ParseMeta { + if len(l.Parses) == 0 { + return ParseMeta{} + } + return l.Parses[len(l.Parses)-1] +} diff --git a/providers/xmlprovider/xmlprovider.go b/providers/xmlprovider/xmlprovider.go index 9a2f33a..e0d87f8 100644 --- a/providers/xmlprovider/xmlprovider.go +++ b/providers/xmlprovider/xmlprovider.go @@ -62,6 +62,7 @@ func (p *XMLProvider[T]) Prepare() { defer p.mu.Unlock() // INFO: We take 1000 here as to not reallocate the memory as mutch. p.Array = make([]T, 0, 1000) + p.Resolver.Clear() } func (p *XMLProvider[T]) Serialize(dataholder XMLRootElement[T], path string, latest ParseMeta) error { @@ -82,15 +83,7 @@ func (p *XMLProvider[T]) Serialize(dataholder XMLRootElement[T], path string, la p.Items.Store(id, &item) } - // INFO: If the item has a GetReferences method, we add the references to the resolver. - if rr, ok := any(item).(ReferenceResolver[T]); ok { - for name, ids := range rr.References() { - for _, res := range ids { - res.Item = &item - p.Resolver.Add(name, res.Reference, res) - } - } - } + p.addResolvable(item) } p.Array = append(p.Array, newItems...) @@ -131,6 +124,19 @@ func (p *XMLProvider[T]) Cleanup(latest ParseMeta) { for _, item := range toappend { p.Array = append(p.Array, *item) + p.addResolvable(*item) + } +} + +func (p *XMLProvider[T]) addResolvable(item T) { + // INFO: If the item has a GetReferences method, we add the references to the resolver. + if rr, ok := any(item).(ReferenceResolver[T]); ok { + for name, ids := range rr.References() { + for _, res := range ids { + res.Item = &item + p.Resolver.Add(name, res.Reference, res) + } + } } } @@ -163,6 +169,14 @@ func (a *XMLProvider[T]) String() string { return s } +func (p *XMLProvider[T]) Info(id string) ItemInfo { + info, ok := p.Infos.Load(id) + if !ok { + return ItemInfo{} + } + return info.(ItemInfo) +} + func (p *XMLProvider[T]) Item(id string) *T { item, ok := p.Items.Load(id) if !ok { diff --git a/xmlmodels/library.go b/xmlmodels/library.go index 2e429ee..0009a11 100644 --- a/xmlmodels/library.go +++ b/xmlmodels/library.go @@ -21,8 +21,8 @@ const ( ) type Library struct { - mu sync.Mutex - Parses []xmlprovider.ParseMeta + mu sync.Mutex + xmlprovider.Library Agents *xmlprovider.XMLProvider[Agent] Places *xmlprovider.XMLProvider[Place]