forked from tangled.org/core
this repo has no description
at master 1.1 kB view raw
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}