package core

import (
	"sync"
)

// Commander is a feature that accepts commands from external source.
type Commander interface {
	Feature
}

type syncCommander struct {
	sync.RWMutex
	Commander
}

func (c *syncCommander) Start() error {
	c.RLock()
	defer c.RUnlock()

	if c.Commander == nil {
		return nil
	}

	return c.Commander.Start()
}

func (c *syncCommander) Close() error {
	c.RLock()
	defer c.RUnlock()

	if c.Commander == nil {
		return nil
	}

	return c.Commander.Close()
}

func (c *syncCommander) Set(commander Commander) {
	c.Lock()
	defer c.Unlock()

	c.Commander = commander
}