use serde::{Deserialize, Deserializer, Serialize};
use std::fmt;
use std::ops::{Deref, DerefMut};
#[repr(C)]
#[derive(Clone, Debug, Deserialize, Serialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum SetType {
#[default]
SpaceLike,
TimeLike,
}
#[repr(C)]
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub enum InterpolatorType {
Bilinear,
LogBilinear,
#[default]
LogBicubic,
LogTricubic,
InterpNDLinear,
LogChebyshev,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct MetaDataV1 {
#[serde(rename = "SetDesc")]
pub set_desc: String,
#[serde(rename = "SetIndex")]
pub set_index: u32,
#[serde(rename = "NumMembers")]
pub num_members: u32,
#[serde(rename = "XMin")]
pub x_min: f64,
#[serde(rename = "XMax")]
pub x_max: f64,
#[serde(rename = "QMin")]
pub q_min: f64,
#[serde(rename = "QMax")]
pub q_max: f64,
#[serde(rename = "Flavors")]
pub flavors: Vec<i32>,
#[serde(rename = "Format")]
pub format: String,
#[serde(rename = "AlphaS_Qs", default)]
pub alphas_q_values: Vec<f64>,
#[serde(rename = "AlphaS_Vals", default)]
pub alphas_vals: Vec<f64>,
#[serde(rename = "Polarized", default)]
pub polarised: bool,
#[serde(rename = "SetType", default)]
pub set_type: SetType,
#[serde(rename = "InterpolatorType", default)]
pub interpolator_type: InterpolatorType,
#[serde(rename = "ErrorType", default)]
pub error_type: String,
#[serde(rename = "Particle", default)]
pub hadron_pid: i32,
#[serde(rename = "GitVersion", default)]
pub git_version: String,
#[serde(rename = "CodeVersion", default)]
pub code_version: String,
#[serde(rename = "FlavorScheme", default)]
pub flavor_scheme: String,
#[serde(rename = "OrderQCD", default)]
pub order_qcd: u32,
#[serde(rename = "AlphaS_OrderQCD", default)]
pub alphas_order_qcd: u32,
#[serde(rename = "MW", default)]
pub m_w: f64,
#[serde(rename = "MZ", default)]
pub m_z: f64,
#[serde(rename = "MUp", default)]
pub m_up: f64,
#[serde(rename = "MDown", default)]
pub m_down: f64,
#[serde(rename = "MStrange", default)]
pub m_strange: f64,
#[serde(rename = "MCharm", default)]
pub m_charm: f64,
#[serde(rename = "MBottom", default)]
pub m_bottom: f64,
#[serde(rename = "MTop", default)]
pub m_top: f64,
#[serde(rename = "AlphaS_Type", default)]
pub alphas_type: String,
#[serde(rename = "NumFlavors", default)]
pub number_flavors: u32,
}
#[derive(Clone, Debug, Serialize)]
#[serde(untagged)]
pub enum MetaData {
V1(MetaDataV1),
}
impl MetaData {
pub fn new_v1(data: MetaDataV1) -> Self {
Self::V1(data)
}
pub fn current_v1(data: MetaDataV1) -> Self {
Self::V1(data)
}
pub fn as_latest(&self) -> MetaDataV1 {
match self {
MetaData::V1(data) => data.clone(),
}
}
}
impl Deref for MetaData {
type Target = MetaDataV1;
fn deref(&self) -> &Self::Target {
match self {
MetaData::V1(data) => data,
}
}
}
impl DerefMut for MetaData {
fn deref_mut(&mut self) -> &mut Self::Target {
match self {
MetaData::V1(data) => data,
}
}
}
impl<'de> Deserialize<'de> for MetaData {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let v1 = MetaDataV1::deserialize(deserializer)?;
Ok(MetaData::V1(v1))
}
}
impl fmt::Display for MetaData {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
writeln!(f, "Set Description: {}", self.set_desc)?;
writeln!(f, "Set Index: {}", self.set_index)?;
writeln!(f, "Number of Members: {}", self.num_members)?;
writeln!(f, "XMin: {}", self.x_min)?;
writeln!(f, "XMax: {}", self.x_max)?;
writeln!(f, "QMin: {}", self.q_min)?;
writeln!(f, "QMax: {}", self.q_max)?;
writeln!(f, "Flavors: {:?}", self.flavors)?;
writeln!(f, "Format: {}", self.format)?;
writeln!(f, "AlphaS Q Values: {:?}", self.alphas_q_values)?;
writeln!(f, "AlphaS Values: {:?}", self.alphas_vals)?;
writeln!(f, "Polarized: {}", self.polarised)?;
writeln!(f, "Set Type: {:?}", self.set_type)?;
writeln!(f, "Interpolator Type: {:?}", self.interpolator_type)?;
writeln!(f, "Error Type: {}", self.error_type)?;
writeln!(f, "Particle: {}", self.hadron_pid)?;
writeln!(f, "Flavor Scheme: {}", self.flavor_scheme)?;
writeln!(f, "Order QCD: {}", self.order_qcd)?;
writeln!(f, "AlphaS Order QCD: {}", self.alphas_order_qcd)?;
writeln!(f, "MW: {}", self.m_w)?;
writeln!(f, "MZ: {}", self.m_z)?;
writeln!(f, "MUp: {}", self.m_up)?;
writeln!(f, "MDown: {}", self.m_down)?;
writeln!(f, "MStrange: {}", self.m_strange)?;
writeln!(f, "MCharm: {}", self.m_charm)?;
writeln!(f, "MBottom: {}", self.m_bottom)?;
writeln!(f, "MTop: {}", self.m_top)?;
writeln!(f, "AlphaS Type: {}", self.alphas_type)?;
writeln!(f, "Number of PDF flavors: {}", self.number_flavors)
}
}