55 lines
876 B
Go
55 lines
876 B
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type BuildFunc func(context.Context, Client) (*Result, error)
|
|
|
|
type Result struct {
|
|
mu sync.Mutex
|
|
Ref Reference
|
|
Refs map[string]Reference
|
|
Metadata map[string][]byte
|
|
}
|
|
|
|
func NewResult() *Result {
|
|
return &Result{}
|
|
}
|
|
|
|
func (r *Result) AddMeta(k string, v []byte) {
|
|
r.mu.Lock()
|
|
if r.Metadata == nil {
|
|
r.Metadata = map[string][]byte{}
|
|
}
|
|
r.Metadata[k] = v
|
|
r.mu.Unlock()
|
|
}
|
|
|
|
func (r *Result) AddRef(k string, ref Reference) {
|
|
r.mu.Lock()
|
|
if r.Refs == nil {
|
|
r.Refs = map[string]Reference{}
|
|
}
|
|
r.Refs[k] = ref
|
|
r.mu.Unlock()
|
|
}
|
|
|
|
func (r *Result) SetRef(ref Reference) {
|
|
r.Ref = ref
|
|
}
|
|
|
|
func (r *Result) SingleRef() (Reference, error) {
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
|
|
if r.Refs != nil && r.Ref == nil {
|
|
return nil, errors.Errorf("invalid map result")
|
|
}
|
|
|
|
return r.Ref, nil
|
|
}
|