|
|
package loader
import ( "context" "errors" "log" "strings"
"git.aiterp.net/rpdata/api/model/character" "github.com/graph-gophers/dataloader" )
// Character gets a character by key
func (loader *Loader) Character(key, value string) (character.Character, error) { if !strings.HasPrefix(key, "Character.") { key = "Character." + key }
if loader.loaders[key] == nil { return character.Character{}, errors.New("unsupported key") }
thunk := loader.loaders[key].Load(loader.ctx, dataloader.StringKey(value)) res, err := thunk() if err != nil { return character.Character{}, err }
char, ok := res.(character.Character) if !ok { return character.Character{}, errors.New("incorrect type") }
return char, nil }
// Characters gets characters by key
func (loader *Loader) Characters(key string, values ...string) ([]character.Character, error) { if !strings.HasPrefix(key, "Character.") { key = "Character." + key }
if loader.loaders[key] == nil { return nil, errors.New("unsupported key") }
thunk := loader.loaders[key].LoadMany(loader.ctx, dataloader.NewKeysFromStrings(values)) res, errs := thunk() for _, err := range errs { if err != nil && err != ErrNotFound { return nil, err } }
chars := make([]character.Character, len(res))
for i := range res { char, ok := res[i].(character.Character) if !ok { return nil, errors.New("incorrect type") }
chars[i] = char }
return chars, nil }
func characterIDBatch(ctx context.Context, keys dataloader.Keys) []*dataloader.Result { results := make([]*dataloader.Result, 0, len(keys)) ids := keys.Keys()
log.Println("Loading", len(ids), "characters:", strings.Join(ids, ","))
characters, err := character.ListIDs(ids...) if err != nil { for range ids { results = append(results, &dataloader.Result{Error: err}) }
return results }
for _, id := range ids { found := false
for _, character := range characters { if character.ID == id { results = append(results, &dataloader.Result{Data: character}) found = true break } }
if !found { results = append(results, &dataloader.Result{Data: character.Character{}, Error: ErrNotFound}) } }
return results }
func characterNickBatch(ctx context.Context, keys dataloader.Keys) []*dataloader.Result { var results []*dataloader.Result nicks := keys.Keys()
characters, err := character.ListNicks(nicks...) if err != nil { for range nicks { results = append(results, &dataloader.Result{Error: err}) }
return results }
for _, nick := range nicks { found := false for i := range characters { if characters[i].HasNick(nick) { results = append(results, &dataloader.Result{Data: characters[i]})
found = true break } }
if !found { results = append(results, &dataloader.Result{Data: character.Character{}, Error: err}) } }
return results }
|