1package api
2
3import (
4	"fmt"
5	"sort"
6)
7
8// Namespaces is used to query the namespace endpoints.
9type Namespaces struct {
10	client *Client
11}
12
13// Namespaces returns a new handle on the namespaces.
14func (c *Client) Namespaces() *Namespaces {
15	return &Namespaces{client: c}
16}
17
18// List is used to dump all of the namespaces.
19func (n *Namespaces) List(q *QueryOptions) ([]*Namespace, *QueryMeta, error) {
20	var resp []*Namespace
21	qm, err := n.client.query("/v1/namespaces", &resp, q)
22	if err != nil {
23		return nil, nil, err
24	}
25	sort.Sort(NamespaceIndexSort(resp))
26	return resp, qm, nil
27}
28
29// PrefixList is used to do a PrefixList search over namespaces
30func (n *Namespaces) PrefixList(prefix string, q *QueryOptions) ([]*Namespace, *QueryMeta, error) {
31	if q == nil {
32		q = &QueryOptions{Prefix: prefix}
33	} else {
34		q.Prefix = prefix
35	}
36
37	return n.List(q)
38}
39
40// Info is used to query a single namespace by its name.
41func (n *Namespaces) Info(name string, q *QueryOptions) (*Namespace, *QueryMeta, error) {
42	var resp Namespace
43	qm, err := n.client.query("/v1/namespace/"+name, &resp, q)
44	if err != nil {
45		return nil, nil, err
46	}
47	return &resp, qm, nil
48}
49
50// Register is used to register a namespace.
51func (n *Namespaces) Register(namespace *Namespace, q *WriteOptions) (*WriteMeta, error) {
52	wm, err := n.client.write("/v1/namespace", namespace, nil, q)
53	if err != nil {
54		return nil, err
55	}
56	return wm, nil
57}
58
59// Delete is used to delete a namespace
60func (n *Namespaces) Delete(namespace string, q *WriteOptions) (*WriteMeta, error) {
61	wm, err := n.client.delete(fmt.Sprintf("/v1/namespace/%s", namespace), nil, q)
62	if err != nil {
63		return nil, err
64	}
65	return wm, nil
66}
67
68// Namespace is used to serialize a namespace.
69type Namespace struct {
70	Name        string
71	Description string
72	Quota       string
73	CreateIndex uint64
74	ModifyIndex uint64
75}
76
77// NamespaceIndexSort is a wrapper to sort Namespaces by CreateIndex. We
78// reverse the test so that we get the highest index first.
79type NamespaceIndexSort []*Namespace
80
81func (n NamespaceIndexSort) Len() int {
82	return len(n)
83}
84
85func (n NamespaceIndexSort) Less(i, j int) bool {
86	return n[i].CreateIndex > n[j].CreateIndex
87}
88
89func (n NamespaceIndexSort) Swap(i, j int) {
90	n[i], n[j] = n[j], n[i]
91}
92