use crate::Handedness;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub enum Variant {
Monoscale,
Multiscale {
scale: f64,
handedness: Handedness,
pfret: f64,
},
}
impl Default for Variant {
fn default() -> Self {
Self::Monoscale
}
}
impl Variant {
pub fn multi() -> Self {
Self::Multiscale {
scale: 610.0,
handedness: Handedness::default(),
pfret: 8.0,
}
}
pub fn scale(&self) -> Option<f64> {
match self {
Self::Monoscale => None,
Self::Multiscale { scale: x, .. } => Some(*x),
}
}
pub fn handedness(&self) -> Option<Handedness> {
match self {
Self::Monoscale => None,
Self::Multiscale { handedness: x, .. } => Some(*x),
}
}
pub fn pfret(&self) -> Option<f64> {
match self {
Self::Monoscale => None,
Self::Multiscale { pfret: x, .. } => Some(*x),
}
}
}
pub struct MultiscaleBuilder {
scale: f64,
handedness: Handedness,
pfret: f64,
}
impl Default for MultiscaleBuilder {
fn default() -> Self {
Self {
scale: 610.0,
handedness: Handedness::default(),
pfret: 8.0,
}
}
}
impl MultiscaleBuilder {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn scale(mut self, scale: f64) -> Self {
self.scale = scale;
self
}
#[must_use]
pub fn handedness(mut self, handedness: Handedness) -> Self {
self.handedness = handedness;
self
}
#[must_use]
pub fn pfret(mut self, pfret: f64) -> Self {
self.pfret = pfret;
self
}
#[must_use]
pub fn build(self) -> Variant {
Variant::Multiscale {
scale: self.scale,
handedness: self.handedness,
pfret: self.pfret,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn variant_default() {
let var = Variant::default();
assert_eq!(Variant::Monoscale, var);
}
#[test]
fn variant_value() {
let var = Variant::Multiscale {
scale: 23.5,
handedness: Handedness::Right,
pfret: 8.0,
};
let val = var.scale();
assert_eq!(val.unwrap(), 23.5);
let hand = var.handedness();
assert_eq!(hand.unwrap(), Handedness::Right);
}
}