1package cli
2
3import (
4	"sync"
5)
6
7// ConcurrentUi is a wrapper around a Ui interface (and implements that
8// interface) making the underlying Ui concurrency safe.
9type ConcurrentUi struct {
10	Ui Ui
11	l  sync.Mutex
12}
13
14func (u *ConcurrentUi) Ask(query string) (string, error) {
15	u.l.Lock()
16	defer u.l.Unlock()
17
18	return u.Ui.Ask(query)
19}
20
21func (u *ConcurrentUi) AskSecret(query string) (string, error) {
22	u.l.Lock()
23	defer u.l.Unlock()
24
25	return u.Ui.AskSecret(query)
26}
27
28func (u *ConcurrentUi) Error(message string) {
29	u.l.Lock()
30	defer u.l.Unlock()
31
32	u.Ui.Error(message)
33}
34
35func (u *ConcurrentUi) Info(message string) {
36	u.l.Lock()
37	defer u.l.Unlock()
38
39	u.Ui.Info(message)
40}
41
42func (u *ConcurrentUi) Output(message string) {
43	u.l.Lock()
44	defer u.l.Unlock()
45
46	u.Ui.Output(message)
47}
48
49func (u *ConcurrentUi) Warn(message string) {
50	u.l.Lock()
51	defer u.l.Unlock()
52
53	u.Ui.Warn(message)
54}
55