use anyhow::Result;
use serde::{Serialize, Serializer};
use std::fmt::Display;
#[derive(Debug, Clone, Copy, Default, Hash)]
pub enum Version {
V1_0,
V2_0,
V3_0,
#[default]
V3_1,
V3_2,
V4_0,
}
impl Display for Version {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let version = match self {
Self::V1_0 => "FCS1.0",
Self::V2_0 => "FCS2.0",
Self::V3_0 => "FCS3.0",
Self::V3_1 => "FCS3.1",
Self::V3_2 => "FCS3.2",
Self::V4_0 => "FCS4.0",
};
write!(f, "{version}")
}
}
impl Serialize for Version {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let version = match self {
Self::V1_0 => "FCS1.0",
Self::V2_0 => "FCS2.0",
Self::V3_0 => "FCS3.0",
Self::V3_1 => "FCS3.1",
Self::V3_2 => "FCS3.2",
Self::V4_0 => "FCS4.0",
};
serializer.serialize_str(version)
}
}
impl Version {
#[must_use]
pub fn get_required_keywords(&self) -> &[&str] {
const V1_0: [&str; 0] = [];
const V2_0: [&str; 5] = [
"$BYTEORD", "$DATATYPE", "$MODE", "$NEXTDATA", "$PAR", ];
const V3_0_V3_1: [&str; 12] = [
"$BEGINANALYSIS", "$BEGINDATA", "$BEGINSTEXT", "$BYTEORD", "$DATATYPE", "$ENDANALYSIS", "$ENDDATA", "$ENDSTEXT", "$MODE", "$NEXTDATA", "$PAR", "$TOT", ];
const V3_2: [&str; 8] = [
"$BEGINDATA",
"$BYTEORD",
"$CYT",
"$DATATYPE",
"$ENDDATA",
"$NEXTDATA",
"$PAR",
"$TOT",
];
const V4_0: [&str; 11] = [
"$BEGINDATA",
"$BYTEORD",
"$DATATYPE",
"$ENDDATA",
"$NEXTDATA",
"$PAR",
"$DATE",
"$ETIM",
"$CYT",
"$BTIM",
"$TOT",
];
match self {
Self::V1_0 => &V1_0,
Self::V2_0 => &V2_0,
Self::V3_0 | Self::V3_1 => &V3_0_V3_1,
Self::V3_2 => &V3_2,
Self::V4_0 => &V4_0,
}
}
}