use std::convert::{TryFrom, TryInto};
use crate::votes::{Votes, VotesError};
use crate::Base16DecodedBytes;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(untagged)]
pub(crate) enum VotesEncodingVariants {
AsStr(Base16DecodedBytes),
AsByteArray(Vec<serde_json::Number>), }
impl TryFrom<VotesEncodingVariants> for Votes {
type Error = VotesError;
fn try_from(value: VotesEncodingVariants) -> Result<Self, Self::Error> {
match value {
VotesEncodingVariants::AsStr(bytes) => bytes.try_into(),
VotesEncodingVariants::AsByteArray(bytes) => bytes.try_into(),
}
}
}
impl TryFrom<Vec<serde_json::Number>> for Votes {
type Error = VotesError;
fn try_from(bytes: Vec<serde_json::Number>) -> Result<Self, Self::Error> {
let bytes_u8: Vec<u8> = bytes
.into_iter()
.map(|n| {
#[allow(clippy::unwrap_used)]
{
n.as_u64().unwrap() as u8
}
})
.collect();
let arr: [u8; 3] = bytes_u8.as_slice().try_into()?;
Ok(Self(arr))
}
}