use serde::{Deserialize, Serialize};
use crate::RegisterError;
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Parameters {
pub m: u64,
pub k: u64,
pub phi_f: f64,
}
impl Parameters {
pub fn to_bytes(&self) -> [u8; 24] {
let mut out = [0; 24];
out[..8].copy_from_slice(&self.m.to_be_bytes());
out[8..16].copy_from_slice(&self.k.to_be_bytes());
out[16..].copy_from_slice(&self.phi_f.to_be_bytes());
out
}
pub fn from_bytes(bytes: &[u8]) -> Result<Self, RegisterError> {
let mut u64_bytes = [0u8; 8];
u64_bytes.copy_from_slice(bytes.get(..8).ok_or(RegisterError::SerializationError)?);
let m = u64::from_be_bytes(u64_bytes);
u64_bytes.copy_from_slice(bytes.get(8..16).ok_or(RegisterError::SerializationError)?);
let k = u64::from_be_bytes(u64_bytes);
u64_bytes.copy_from_slice(bytes.get(16..24).ok_or(RegisterError::SerializationError)?);
let phi_f = f64::from_be_bytes(u64_bytes);
Ok(Self { m, k, phi_f })
}
}
#[cfg(test)]
mod tests {
use super::*;
mod golden {
use super::*;
const GOLDEN_JSON: &str = r#"
{
"m": 20973,
"k": 2422,
"phi_f": 0.2
}
"#;
fn golden_value() -> Parameters {
Parameters {
m: 20973,
k: 2422,
phi_f: 0.2,
}
}
#[test]
fn golden_conversions() {
let value = serde_json::from_str(GOLDEN_JSON)
.expect("This JSON deserialization should not fail");
assert_eq!(golden_value(), value);
let serialized =
serde_json::to_string(&value).expect("This JSON serialization should not fail");
let golden_serialized = serde_json::to_string(&golden_value())
.expect("This JSON serialization should not fail");
assert_eq!(golden_serialized, serialized);
}
}
}