You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.3 KiB
66 lines
1.3 KiB
package loader
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"strings"
|
|
|
|
"git.aiterp.net/rpdata/api/model/channel"
|
|
"github.com/graph-gophers/dataloader"
|
|
)
|
|
|
|
// Channel gets a character by key
|
|
func (loader *Loader) Channel(key, value string) (channel.Channel, error) {
|
|
if !strings.HasPrefix(key, "Channel.") {
|
|
key = "Channel." + key
|
|
}
|
|
|
|
if loader.loaders[key] == nil {
|
|
return channel.Channel{}, errors.New("unsupported key")
|
|
}
|
|
|
|
thunk := loader.loaders[key].Load(loader.ctx, dataloader.StringKey(value))
|
|
res, err := thunk()
|
|
if err != nil {
|
|
return channel.Channel{}, err
|
|
}
|
|
|
|
channel, ok := res.(channel.Channel)
|
|
if !ok {
|
|
return channel, errors.New("incorrect type")
|
|
}
|
|
|
|
return channel, nil
|
|
}
|
|
|
|
func channelNameBatch(ctx context.Context, keys dataloader.Keys) []*dataloader.Result {
|
|
var results []*dataloader.Result
|
|
names := keys.Keys()
|
|
|
|
channels, err := channel.ListNames(names...)
|
|
if err != nil {
|
|
for range names {
|
|
results = append(results, &dataloader.Result{Data: channel.Channel{}, Error: err})
|
|
}
|
|
|
|
return results
|
|
}
|
|
|
|
for _, name := range names {
|
|
found := false
|
|
for i := range channels {
|
|
if channels[i].Name == name {
|
|
results = append(results, &dataloader.Result{Data: channels[i]})
|
|
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
results = append(results, &dataloader.Result{Data: channel.Channel{}, Error: err})
|
|
}
|
|
}
|
|
|
|
return results
|
|
}
|