59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
package text
|
|
|
|
import (
|
|
"github.com/inkyblackness/hacked/ss1/resource"
|
|
)
|
|
|
|
// ElectronicMessageCache retrieves messages from a localizer and keeps them decoded until they are invalidated.
|
|
type ElectronicMessageCache struct {
|
|
cp Codepage
|
|
localizer resource.Localizer
|
|
|
|
messages map[resource.Key]ElectronicMessage
|
|
}
|
|
|
|
// NewElectronicMessageCache returns a new instance.
|
|
func NewElectronicMessageCache(cp Codepage, localizer resource.Localizer) *ElectronicMessageCache {
|
|
cache := &ElectronicMessageCache{
|
|
cp: cp,
|
|
localizer: localizer,
|
|
|
|
messages: make(map[resource.Key]ElectronicMessage),
|
|
}
|
|
return cache
|
|
}
|
|
|
|
// InvalidateResources lets the cache remove any texts from resources that are specified in the given slice.
|
|
func (cache *ElectronicMessageCache) InvalidateResources(ids []resource.ID) {
|
|
for _, id := range ids {
|
|
for key := range cache.messages {
|
|
if key.ID == id {
|
|
delete(cache.messages, key)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Message retrieves and caches the message of given key.
|
|
func (cache *ElectronicMessageCache) Message(key resource.Key) (ElectronicMessage, error) {
|
|
cacheKey := resource.KeyOf(key.ID.Plus(key.Index), key.Lang, 0)
|
|
value, existing := cache.messages[cacheKey]
|
|
if existing {
|
|
return value, nil
|
|
}
|
|
selector := cache.localizer.LocalizedResources(key.Lang)
|
|
view, err := selector.Select(cacheKey.ID)
|
|
if err != nil {
|
|
return EmptyElectronicMessage(), err
|
|
}
|
|
if (view.ContentType() != resource.Text) || !view.Compound() {
|
|
return EmptyElectronicMessage(), resource.ErrWrongType(key, resource.Text)
|
|
}
|
|
value, err = DecodeElectronicMessage(cache.cp, view)
|
|
if err != nil {
|
|
return EmptyElectronicMessage(), err
|
|
}
|
|
cache.messages[cacheKey] = value
|
|
return value, nil
|
|
}
|