Skip to main content

sov_universal_wallet/schema/
primitive.rs

1use borsh::{BorshDeserialize, BorshSerialize};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5use crate::ty::{ByteDisplay, IntegerDisplay, IntegerType, LinkingScheme, Ty};
6
7#[derive(Clone, Debug, PartialEq, Eq, BorshSerialize, BorshDeserialize)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub enum Primitive {
10    Integer(IntegerType, IntegerDisplay),
11    ByteArray { len: usize, display: ByteDisplay },
12    ByteVec { display: ByteDisplay },
13    Float32,
14    Float64,
15    String,
16    Boolean,
17    Skip { len: usize },
18}
19
20impl<L: LinkingScheme> From<Primitive> for Ty<L> {
21    fn from(val: Primitive) -> Self {
22        match val {
23            Primitive::Integer(t, d) => Ty::Integer(t, d),
24            Primitive::ByteArray { len, display } => Ty::ByteArray { len, display },
25            Primitive::ByteVec { display } => Ty::ByteVec { display },
26            Primitive::Float32 => Ty::Float32,
27            Primitive::Float64 => Ty::Float64,
28            Primitive::String => Ty::String,
29            Primitive::Boolean => Ty::Boolean,
30            Primitive::Skip { len } => Ty::Skip { len },
31        }
32    }
33}
34
35#[derive(Debug, Clone, Copy, PartialEq, Eq)]
36pub struct ErrNotAPrimitive;
37
38impl<L: LinkingScheme> TryFrom<Ty<L>> for Primitive {
39    type Error = ErrNotAPrimitive;
40
41    fn try_from(value: Ty<L>) -> Result<Self, Self::Error> {
42        match value {
43            Ty::Integer(t, d) => Ok(Primitive::Integer(t, d)),
44            Ty::ByteArray { len, display } => Ok(Primitive::ByteArray { len, display }),
45            Ty::Float32 => Ok(Primitive::Float32),
46            Ty::Float64 => Ok(Primitive::Float64),
47            Ty::String => Ok(Primitive::String),
48            Ty::Boolean => Ok(Primitive::Boolean),
49            Ty::Skip { len } => Ok(Primitive::Skip { len }),
50            _ => Err(ErrNotAPrimitive),
51        }
52    }
53}