use std::sync::Arc;
use compare_variables::compare_variables;
use stem_material::prelude::*;
#[cfg(feature = "serde")]
use stem_material::prelude::serialize_quantity;
#[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 RectangularWire {
#[cfg_attr(feature = "serde", serde(serialize_with = "serialize_arc_link",))]
conductor_material: Arc<Material>,
#[cfg_attr(feature = "serde", serde(serialize_with = "serialize_quantity"))]
height: Length,
#[cfg_attr(feature = "serde", serde(serialize_with = "serialize_quantity"))]
width: Length,
#[cfg_attr(feature = "serde", serde(serialize_with = "serialize_quantity"))]
insulation_thickness: Length,
}
impl RectangularWire {
pub fn new(
conductor_material: Arc<Material>,
height: Length,
width: Length,
insulation_thickness: Length,
) -> Result<Self, crate::error::Error> {
return RectangularWire {
conductor_material,
height,
width,
insulation_thickness,
}
.check();
}
fn check(self) -> Result<Self, crate::error::Error> {
let zero_length = Length::new::<meter>(0.0);
compare_variables!(zero_length < self.height)?;
compare_variables!(zero_length < self.width)?;
compare_variables!(zero_length <= self.insulation_thickness)?;
return Ok(self);
}
pub fn insulation_thickness(&self) -> Length {
return self.insulation_thickness;
}
pub fn conductor_area(&self) -> Area {
return self.height * self.width;
}
pub fn overall_area(&self) -> Area {
return (self.height + 2.0 * self.insulation_thickness)
* (self.width + 2.0 * self.insulation_thickness);
}
}
#[cfg_attr(feature = "serde", typetag::serde)]
impl Wire for RectangularWire {
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.conductor_area();
}
fn effective_overall_area(&self, _zone_area: Area, _turns: usize) -> Area {
return self.overall_area();
}
}
#[cfg(feature = "serde")]
impl<'de> Deserialize<'de> for RectangularWire {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde_mosaic::deserialize_arc_link;
use stem_material::prelude::deserialize_quantity;
#[derive(Deserialize)]
#[serde(deny_unknown_fields)]
struct RectangularWireSerde {
#[serde(deserialize_with = "deserialize_arc_link")]
conductor_material: Arc<Material>,
#[serde(deserialize_with = "deserialize_quantity")]
height: Length, #[serde(deserialize_with = "deserialize_quantity")]
width: Length, #[serde(deserialize_with = "deserialize_quantity")]
insulation_thickness: Length, }
let wire_serde = RectangularWireSerde::deserialize(deserializer)?;
return RectangularWire {
conductor_material: wire_serde.conductor_material,
height: wire_serde.height,
width: wire_serde.width,
insulation_thickness: wire_serde.insulation_thickness,
}
.check()
.map_err(serde::de::Error::custom);
}
}