code: func (a *ACLs) loadReaders(ctx *validation.Context, readers []string) []string {
  	known := stringset.New(len(readers))
  	for _, r := range readers {
  		id := r
  		switch {
  		case strings.HasPrefix(r, "group:"):
  			if r[len("group:"):] == "" {
  				ctx.Errorf("invalid readers %q: needs a group name", r)
  			}
  		case !strings.ContainsRune(r, ':'):
  			id = "user:" + r
  			fallthrough
  		default:
  			if _, err := identity.MakeIdentity(id); err != nil {
  				ctx.Error(errors.Annotate(err, "invalid readers %q", r).Err())
  				continue
  			}
  		}
  		if !known.Add(id) {
  			ctx.Errorf("duplicate readers %q", r)
  		}
  	}
  	res := known.ToSlice()
  	sort.Strings(res)
  	return res
  }
docs: // loadReaders validates readers and returns slice of valid identities.