use serde::{Serialize, Serializer};
pub const COBBLE_VERSION: &str = match option_env!("COBBLE_LANG_VERSION") {
Some(version) => version,
None => env!("CARGO_PKG_VERSION"),
};
pub const SUPPORTED_MINECRAFT_VERSION: &str = "26.1.2";
pub const SUPPORTED_PACK_FORMAT: PackFormat = PackFormat::Decimal(101, 1);
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PackFormat {
Integer(u8),
Decimal(u8, u8),
}
impl PackFormat {
pub fn from_int(value: u8) -> Self {
PackFormat::Integer(value)
}
pub fn parse_format(s: &str) -> Result<Self, String> {
if let Some(dot_pos) = s.find('.') {
let major = s[..dot_pos]
.parse::<u8>()
.map_err(|_| format!("Invalid pack format: {}", s))?;
let minor = s[dot_pos + 1..]
.parse::<u8>()
.map_err(|_| format!("Invalid pack format: {}", s))?;
Ok(PackFormat::Decimal(major, minor))
} else {
let value = s
.parse::<u8>()
.map_err(|_| format!("Invalid pack format: {}", s))?;
Ok(PackFormat::Integer(value))
}
}
pub fn to_json_value(&self) -> serde_json::Value {
match self {
PackFormat::Integer(v) => serde_json::Value::Number((*v).into()),
PackFormat::Decimal(major, minor) => {
let value_str = format!("{}.{}", major, minor);
let value: f64 = value_str.parse().unwrap();
serde_json::json!(value)
}
}
}
pub fn major(&self) -> u8 {
match self {
PackFormat::Integer(v) => *v,
PackFormat::Decimal(major, _) => *major,
}
}
pub fn is_supported(self) -> bool {
self == SUPPORTED_PACK_FORMAT
}
}
impl Default for PackFormat {
fn default() -> Self {
SUPPORTED_PACK_FORMAT
}
}
impl std::fmt::Display for PackFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PackFormat::Integer(v) => write!(f, "{}", v),
PackFormat::Decimal(major, minor) => write!(f, "{}.{}", major, minor),
}
}
}
impl Serialize for PackFormat {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match self {
PackFormat::Integer(v) => serializer.serialize_u8(*v),
PackFormat::Decimal(major, minor) => {
let value_str = format!("{}.{}", major, minor);
let value: f64 = value_str.parse().unwrap();
serializer.serialize_f64(value)
}
}
}
}