use std::sync::Arc;
use compare_variables::compare_variables;
use stem_material::prelude::*;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "serde")]
use serde_mosaic::serialize_arc_link;
use super::wire::Wire;
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "serde", derive(Serialize))]
#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
pub struct SffWire {
#[cfg_attr(feature = "serde", serde(serialize_with = "serialize_arc_link",))]
conductor_material: Arc<Material>,
slot_fill_factor_conductor: f64,
slot_fill_factor_overall: f64,
}
impl SffWire {
pub fn new(
conductor_material: Arc<Material>,
slot_fill_factor_conductor: f64,
slot_fill_factor_overall: f64,
) -> Result<Self, crate::error::Error> {
return SffWire {
conductor_material,
slot_fill_factor_conductor,
slot_fill_factor_overall,
}
.check();
}
fn check(self) -> Result<Self, crate::error::Error> {
compare_variables!(0.0 <= self.slot_fill_factor_conductor <= 1.0)?;
compare_variables!(0.0 <= self.slot_fill_factor_overall <= 1.0)?;
compare_variables!(self.slot_fill_factor_conductor <= self.slot_fill_factor_overall)?;
return Ok(self);
}
}
#[cfg_attr(feature = "serde", typetag::serde)]
impl Wire for SffWire {
fn slot_fill_factor_conductor(&self, _zone_area: Area, _turns: usize) -> f64 {
return self.slot_fill_factor_conductor;
}
fn slot_fill_factor_overall(&self, _zone_area: Area, _turns: usize) -> f64 {
return self.slot_fill_factor_overall;
}
fn material(&self) -> &Material {
return &*self.conductor_material;
}
fn material_arc(&self) -> Arc<Material> {
return self.conductor_material.clone();
}
fn effective_conductor_area(&self, zone_area: Area, turns: usize) -> Area {
return self.slot_fill_factor_conductor(zone_area, turns) * zone_area / turns as f64;
}
fn effective_overall_area(&self, zone_area: Area, turns: usize) -> Area {
return self.slot_fill_factor_overall(zone_area, turns) * zone_area / turns as f64;
}
}
#[cfg(feature = "serde")]
impl<'de> Deserialize<'de> for SffWire {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde_mosaic::deserialize_arc_link;
#[derive(Deserialize)]
#[serde(deny_unknown_fields)]
struct SffWireSerde {
#[serde(deserialize_with = "deserialize_arc_link")]
conductor_material: Arc<Material>,
slot_fill_factor_conductor: f64,
slot_fill_factor_overall: f64,
}
let wire_serde = SffWireSerde::deserialize(deserializer)?;
return SffWire {
conductor_material: wire_serde.conductor_material,
slot_fill_factor_conductor: wire_serde.slot_fill_factor_conductor,
slot_fill_factor_overall: wire_serde.slot_fill_factor_overall,
}
.check()
.map_err(serde::de::Error::custom);
}
}