package stty

import(
    "os/exec"
    "fmt"
)

type real struct {
}

func (r *real) SetBaudRate(portPath string, baudrate int) error {
	setBaudRateCMD := exec.Command("stty", "-F", portPath, fmt.Sprint(baudrate))
	_, err := setBaudRateCMD.Output()
    if err != nil {
        return errStack(ERR_SET_BAUDRATE_FAILED(), err)
    }
    return nil
}

func (r *real) CheckBaudRate(portPath string) (baudrate int, err error) {
	checkBaudRateCMD := exec.Command("stty", "-F", portPath, "speed")
	sttyOutput, err := checkBaudRateCMD.Output()
	if err != nil {
		return 0, err
	}

	_, err = fmt.Sscan(string(sttyOutput), &baudrate)
	if err != nil {
		return 0, err
	}
	return baudrate, nil
}

func (r *real) TestBaudRate(portPath string, baudrate int) error {
	err := r.SetBaudRate(portPath, baudrate)
	if err != nil {
		return err
	}

	newBaudRate, err := r.CheckBaudRate(portPath)
	if err != nil {
		return errStack(ERR_CHECK_BAUDRATE_FAILED(), err)
	}

	if newBaudRate == baudrate {
		return nil
	}
	return ERR_BAUDRATE_NOT_SUPPORTED() 
}