castep-cell-io 0.2.12

A crate helping to parse, edit and save `castep` input file format `.cell`
Documentation
use std::fmt::Display;

use crate::formatting::BlockDisplay;

use crate::cell_document::units::{efield_units::EFieldUnit, pressure_units::PressureUnits};

#[derive(Debug, Clone, Copy, Default)]
pub struct ExtEFieldBlock {
    unit: EFieldUnit,
    x: f64,
    y: f64,
    z: f64,
}

impl BlockDisplay for ExtEFieldBlock {
    fn block_tag(&self) -> String {
        "EXTERNAL_EFIELD".to_string()
    }

    fn entries(&self) -> String {
        let unit_line = if self.unit == EFieldUnit::default() {
            String::new()
        } else {
            format!("{}\n", self.unit)
        };
        format!(
            "{unit_line}{:16.10}{:16.10}{:16.10}",
            self.x, self.y, self.z
        )
    }
}

impl Display for ExtEFieldBlock {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.content())
    }
}

#[derive(Debug, Clone, Copy, Default)]
pub struct ExtPressureBlock {
    unit: PressureUnits,
    components: [f64; 6],
}

impl BlockDisplay for ExtPressureBlock {
    fn block_tag(&self) -> String {
        "EXTERNAL_PRESSURE".to_string()
    }

    fn entries(&self) -> String {
        let unit_line = if self.unit == PressureUnits::default() {
            String::new()
        } else {
            format!("{}\n", self.unit)
        };
        let [rxx, rxy, rxz, ryy, ryz, rzz] = self.components;
        let pressures = format!(
            r#"{:16.10}{:16.10}{:16.10}
                {:16.10}{:16.10}
                                {:16.10}"#,
            rxx, rxy, rxz, ryy, ryz, rzz
        );
        [unit_line, pressures].concat()
    }
}

impl Display for ExtPressureBlock {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.content())
    }
}

#[cfg(test)]
mod test {
    use crate::cell_document::sections::external_fields::ExtPressureBlock;

    use super::ExtEFieldBlock;

    #[test]
    fn ext_efield() {
        let item = ExtEFieldBlock::default();
        println!("{item}");
        let pressure = ExtPressureBlock::default();
        println!("{pressure}");
    }
}