use super::*;
impl<N: Network> FromBits for Identifier<N> {
fn from_bits_le(bits_le: &[bool]) -> Result<Self> {
ensure!(bits_le.len() <= Field::<N>::size_in_bits(), "Identifier exceeds the maximum bits allowed");
let bytes = bits_le.chunks(8).map(u8::from_bits_le).collect::<Result<Vec<u8>>>()?;
let num_bytes = match bytes.iter().position(|&byte| byte == 0) {
Some(index) => index, None => bytes.len(), };
Self::from_str(str::from_utf8(&bytes[0..num_bytes])?)
}
fn from_bits_be(bits_be: &[bool]) -> Result<Self> {
Self::from_bits_le(&bits_be.iter().rev().copied().collect::<Vec<bool>>())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::data::identifier::tests::sample_identifier;
use snarkvm_console_network::MainnetV0;
type CurrentNetwork = MainnetV0;
const ITERATIONS: usize = 100;
#[test]
fn test_from_bits_le() -> Result<()> {
let mut rng = TestRng::default();
for _ in 0..ITERATIONS {
let identifier = sample_identifier::<CurrentNetwork>(&mut rng)?;
assert_eq!(identifier, Identifier::from_bits_le(&identifier.to_bits_le())?);
}
Ok(())
}
#[test]
fn test_from_bits_be() -> Result<()> {
let mut rng = TestRng::default();
for _ in 0..ITERATIONS {
let identifier = sample_identifier::<CurrentNetwork>(&mut rng)?;
assert_eq!(identifier, Identifier::from_bits_be(&identifier.to_bits_be())?);
}
Ok(())
}
}