use std::cell::BorrowMutError;
use snafu::Snafu;
use vexide::{
controller::ControllerError,
math::Angle,
prelude::Controller,
smart::{PortError, motor::BrakeMode},
};
use crate::utils::error::Report;
pub mod differential;
pub trait Drivable {
fn tank(&mut self, controller: &Controller) -> Result<(), DrivetrainError>;
fn arcade(&mut self, controller: &Controller) -> Result<(), DrivetrainError>;
fn reverse_tank(&mut self, controller: &Controller) -> Result<(), DrivetrainError>;
fn reverse_arcade(&mut self, controller: &Controller) -> Result<(), DrivetrainError>;
}
pub trait Differential {
fn set_brakemode(&self, brakemode: BrakeMode) -> Result<(), DrivetrainError>;
fn position(&self) -> Report<Angle, Vec<DrivetrainError>>;
fn left_position(&self) -> Report<Angle, Vec<DrivetrainError>>;
fn right_position(&self) -> Report<Angle, Vec<DrivetrainError>>;
fn reset_position(&self) -> Result<(), DrivetrainError>;
fn set_position(&self, position: Angle) -> Result<(), DrivetrainError>;
fn set_voltage(&self, voltage: f64) -> Result<(), DrivetrainError>;
fn set_left_voltage(&self, voltage: f64) -> Result<(), DrivetrainError>;
fn set_right_voltage(&self, voltage: f64) -> Result<(), DrivetrainError>;
}
#[derive(Debug, Snafu)]
pub enum DrivetrainError {
#[snafu(transparent)]
PortError {
source: PortError,
},
#[snafu(transparent)]
ControllerError {
source: ControllerError,
},
#[snafu(transparent)]
BorrowMutError {
source: BorrowMutError,
},
Unknown {
string: String,
},
}