func (s Spec) Name() string {
	group := strings.ToLower(fmt.Sprint(s.Group))
	kind := strings.ToLower(fmt.Sprint(s.Kind))
	if s.Group == Global {
		return fmt.Sprintf("%v/%v", group, kind)
	}
	var user string
	switch s.Group {
	case Tree:
		user = fmt.Sprint(s.TreeID)
	case User:
		user = s.User
	}
	return fmt.Sprintf("%vs/%v/%v", group, user, kind)
}
Name returns a textual representation of the Spec. Names are constant and may be relied upon to
not change in the future.

Names are created as follows:
* Global quotas are mapped to "global/read" or "global/write"
* Tree quotas are mapped to "trees/$TreeID/$Kind". E.g., "trees/10/read".
* User quotas are mapped to "users/$User/$Kind". E.g., "trees/10/read".
package quota
import (
	"context"
	"fmt"
	"strings"
)
const MaxTokens = int(^uint(0) >> 1)  
type Group int
const (
	Global Group = iota
	Tree
	User
)
type Kind int
const (
	Read Kind = iota
	Write
)
type Spec struct {
	Group
	Kind
	TreeID int64
	User string
	Refundable bool
}