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 // Create a channel to handle context cancellation
35 done := make(chan struct{})
36 defer close(done)
37
38 // Start a goroutine for each identifier
39 for idx, ident := range idents {
40 wg.Add(1)
41 go func(index int, id string) {
42 defer wg.Done()
43
44 select {
45 case <-ctx.Done():
46 results[index] = nil
47 case <-done:
48 results[index] = nil
49 default:
50 // Resolve the identifier - if error, identity will be nil
51 identity, _ := r.ResolveIdent(ctx, id)
52 results[index] = identity
53 }
54 }(idx, ident)
55 }
56
57 wg.Wait()
58 return results
59}