1package appview
2
3import (
4 "context"
5 "sync"
6
7 "github.com/bluesky-social/indigo/atproto/identity"
8 "github.com/bluesky-social/indigo/atproto/syntax"
9)
10
11type Resolver struct {
12 directory identity.Directory
13}
14
15func NewResolver() *Resolver {
16 return &Resolver{
17 directory: identity.DefaultDirectory(),
18 }
19}
20
21func (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
30func (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}