code: func parsePerChannelLimits(itf interface{}, opts *Options) error {
  	m, ok := itf.(map[string]interface{})
  	if !ok {
  		return fmt.Errorf("expected per channel limits to be a map/struct, got %v", itf)
  	}
  	for channelName, limits := range m {
  		limitsMap, ok := limits.(map[string]interface{})
  		if !ok {
  			return fmt.Errorf("expected channel limits to be a map/struct, got %v", limits)
  		}
  		if !util.IsChannelNameValid(channelName, true) {
  			return fmt.Errorf("invalid channel name %q", channelName)
  		}
  		cl := &stores.ChannelLimits{}
  		for k, v := range limitsMap {
  			name := strings.ToLower(k)
  			if err := parseChannelLimits(cl, k, name, v, false); err != nil {
  				return err
  			}
  		}
  		sl := &opts.StoreLimits
  		sl.AddPerChannel(channelName, cl)
  	}
  	return nil
  }
docs: // parsePerChannelLimits updates `opts` with per channel limits.