use {
crate::compute_commit,
serde_derive::{Deserialize, Serialize},
solana_sdk::sanitize::Sanitize,
std::{convert::TryInto, fmt},
};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, AbiExample)]
pub struct LegacyVersion1 {
major: u16,
minor: u16,
patch: u16,
commit: Option<u32>, }
impl Sanitize for LegacyVersion1 {}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, AbiExample)]
pub struct LegacyVersion2 {
pub major: u16,
pub minor: u16,
pub patch: u16,
pub commit: Option<u32>, pub feature_set: u32, }
impl From<LegacyVersion1> for LegacyVersion2 {
fn from(legacy_version: LegacyVersion1) -> Self {
Self {
major: legacy_version.major,
minor: legacy_version.minor,
patch: legacy_version.patch,
commit: legacy_version.commit,
feature_set: 0,
}
}
}
impl Default for LegacyVersion2 {
fn default() -> Self {
let feature_set = u32::from_le_bytes(
solana_sdk::feature_set::ID.as_ref()[..4]
.try_into()
.unwrap(),
);
Self {
major: env!("CARGO_PKG_VERSION_MAJOR").parse().unwrap(),
minor: env!("CARGO_PKG_VERSION_MINOR").parse().unwrap(),
patch: env!("CARGO_PKG_VERSION_PATCH").parse().unwrap(),
commit: compute_commit(option_env!("CI_COMMIT")),
feature_set,
}
}
}
impl fmt::Display for LegacyVersion2 {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}.{}.{}", self.major, self.minor, self.patch,)
}
}
impl fmt::Debug for LegacyVersion2 {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}.{}.{} (src:{}; feat:{})",
self.major,
self.minor,
self.patch,
match self.commit {
None => "devbuild".to_string(),
Some(commit) => format!("{commit:08x}"),
},
self.feature_set,
)
}
}
impl Sanitize for LegacyVersion2 {}