code: func (p *Client) DiscoverProfile(force bool) (*ble.Profile, error) {
  	if p.profile != nil && !force {
  		return p.profile, nil
  	}
  	ss, err := p.DiscoverServices(nil)
  	if err != nil {
  		return nil, fmt.Errorf("can't discover services: %s\n", err)
  	}
  	for _, s := range ss {
  		cs, err := p.DiscoverCharacteristics(nil, s)
  		if err != nil {
  			return nil, fmt.Errorf("can't discover characteristics: %s\n", err)
  		}
  		for _, c := range cs {
  			_, err := p.DiscoverDescriptors(nil, c)
  			if err != nil {
  				return nil, fmt.Errorf("can't discover descriptors: %s\n", err)
  			}
  		}
  	}
  	p.profile = &ble.Profile{Services: ss}
  	return p.profile, nil
  }
docs: // DiscoverProfile discovers the whole hierachy of a server.