56 lines
1.1 kB
1
package appview
2
3
import (
4
"context"
5
"sync"
6
7
"github.com/bluesky-social/indigo/atproto/identity"
8
"github.com/bluesky-social/indigo/atproto/syntax"
9
)
10
11
type Resolver struct {
12
directory identity.Directory
13
}
14
15
func NewResolver() *Resolver {
16
return &Resolver{
17
directory: identity.DefaultDirectory(),
18
}
19
}
20
21
func (r *Resolver) ResolveIdent(ctx context.Context, arg string) (*identity.Identity, error) {
22
id, err := syntax.ParseAtIdentifier(arg)
23
if err != nil {
24
return nil, err
25
}
26
27
return r.directory.Lookup(ctx, *id)
28
}
29
30
func (r *Resolver) ResolveIdents(ctx context.Context, idents []string) []*identity.Identity {
31
results := make([]*identity.Identity, len(idents))
32
var wg sync.WaitGroup
33
34
done := make(chan struct{})
35
defer close(done)
36
37
for idx, ident := range idents {
38
wg.Add(1)
39
go func(index int, id string) {
40
defer wg.Done()
41
42
select {
43
case <-ctx.Done():
44
results[index] = nil
45
case <-done:
46
results[index] = nil
47
default:
48
identity, _ := r.ResolveIdent(ctx, id)
49
results[index] = identity
50
}
51
}(idx, ident)
52
}
53
54
wg.Wait()
55
return results
56
}
57