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 super::{OptionDisplay, ParamSectionDisplay};

#[derive(Debug, Clone, Copy)]
#[allow(non_camel_case_types, clippy::upper_case_acronyms)]
pub enum PopulationParam {
    PDOS_CALCULATE_WEIGHTS(bool),
    POPN_BOND_CUTOFF(f64),
    POPN_CALCULATE(bool),
    POPN_WRITE(PopnWrite),
}

#[derive(Debug, Clone)]
pub struct PopulationAnalysisSection {
    params: Vec<PopulationParam>,
}

impl PopulationAnalysisSection {
    pub fn new(params: Vec<PopulationParam>) -> Self {
        Self { params }
    }

    pub fn params(&self) -> &[PopulationParam] {
        &self.params
    }
}

impl Default for PopulationAnalysisSection {
    fn default() -> Self {
        Self::new(vec![
            PopulationParam::PDOS_CALCULATE_WEIGHTS(true),
            PopulationParam::POPN_BOND_CUTOFF(3_f64),
            PopulationParam::POPN_CALCULATE(true),
        ])
    }
}

impl OptionDisplay for PopulationParam {
    fn tag(&self) -> String {
        match self {
            PopulationParam::PDOS_CALCULATE_WEIGHTS(_) => "pdos_calculate_weights".to_string(),
            PopulationParam::POPN_BOND_CUTOFF(_) => "popn_bond_cutoff".to_string(),
            PopulationParam::POPN_CALCULATE(_) => "popn_calculate".to_string(),
            PopulationParam::POPN_WRITE(_) => "popn_write".to_string(),
        }
    }

    fn value(&self) -> String {
        match self {
            PopulationParam::PDOS_CALCULATE_WEIGHTS(b) => format!("{b}"),
            PopulationParam::POPN_BOND_CUTOFF(f) => format!("{f:24.15}"),
            PopulationParam::POPN_CALCULATE(b) => format!("{b}"),
            PopulationParam::POPN_WRITE(p) => format!("{p}"),
        }
    }
}

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

impl ParamSectionDisplay for PopulationAnalysisSection {
    fn options(&self) -> &[impl Display] {
        self.params()
    }
}

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

#[derive(Debug, Clone, Copy, Default)]
pub enum PopnWrite {
    None,
    Minimal,
    Summary,
    #[default]
    Enhanced,
    Verbose,
}

impl Display for PopnWrite {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            PopnWrite::None => f.write_str("None"),
            PopnWrite::Minimal => f.write_str("Minimal"),
            PopnWrite::Summary => f.write_str("Summary"),
            PopnWrite::Enhanced => f.write_str("Enhanced"),
            PopnWrite::Verbose => f.write_str("Verbose"),
        }
    }
}