1package beanstalk
2
3import (
4	"time"
5)
6
7// TubeSet represents a set of tubes on the server connected to by Conn.
8// Name names the tubes represented.
9type TubeSet struct {
10	Conn *Conn
11	Name map[string]bool
12}
13
14// NewTubeSet returns a new TubeSet representing the given names.
15func NewTubeSet(c *Conn, name ...string) *TubeSet {
16	ts := &TubeSet{c, make(map[string]bool)}
17	for _, s := range name {
18		ts.Name[s] = true
19	}
20	return ts
21}
22
23// Reserve reserves and returns a job from one of the tubes in t. If no
24// job is available before time timeout has passed, Reserve returns a
25// ConnError recording ErrTimeout.
26//
27// Typically, a client will reserve a job, perform some work, then delete
28// the job with Conn.Delete.
29func (t *TubeSet) Reserve(timeout time.Duration) (id uint64, body []byte, err error) {
30	r, err := t.Conn.cmd(nil, t, nil, "reserve-with-timeout", dur(timeout))
31	if err != nil {
32		return 0, nil, err
33	}
34	body, err = t.Conn.readResp(r, true, "RESERVED %d", &id)
35	if err != nil {
36		return 0, nil, err
37	}
38	return id, body, nil
39}
40