leaf-protocol-types 0.1.0

Core types for the leaf protocol.
Documentation
use std::collections::{HashMap, HashSet};

use crate::BorshSchema;

pub trait HasBorshSchema {
    fn borsh_schema() -> BorshSchema;
}

macro_rules! impl_primitive {
    ($prim:ty, $var:ident) => {
        impl HasBorshSchema for $prim {
            fn borsh_schema() -> BorshSchema {
                BorshSchema::$var
            }
        }
    };
}
impl_primitive!((), Null);
impl_primitive!(bool, Bool);
impl_primitive!(u8, U8);
impl_primitive!(u16, U16);
impl_primitive!(u32, U32);
impl_primitive!(u64, U64);
impl_primitive!(u128, U128);
impl_primitive!(i8, I8);
impl_primitive!(i16, U16);
impl_primitive!(i32, U32);
impl_primitive!(i64, U64);
impl_primitive!(i128, U128);
impl_primitive!(f32, F32);
impl_primitive!(f64, F64);
impl_primitive!(String, String);

impl<T: HasBorshSchema> HasBorshSchema for Option<T> {
    fn borsh_schema() -> BorshSchema {
        BorshSchema::Option {
            schema: Box::new(T::borsh_schema().clone()),
        }
    }
}
impl<T: HasBorshSchema, const N: usize> HasBorshSchema for [T; N] {
    fn borsh_schema() -> BorshSchema {
        BorshSchema::Array {
            schema: Box::new(T::borsh_schema().clone()),
            len: N.try_into().unwrap(),
        }
    }
}
impl<T: HasBorshSchema> HasBorshSchema for Vec<T> {
    fn borsh_schema() -> BorshSchema {
        BorshSchema::Vector {
            schema: Box::new(T::borsh_schema().clone()),
        }
    }
}
impl<T: HasBorshSchema> HasBorshSchema for HashSet<T> {
    fn borsh_schema() -> BorshSchema {
        BorshSchema::Set {
            schema: Box::new(T::borsh_schema().clone()),
        }
    }
}
impl<K: HasBorshSchema, V: HasBorshSchema> HasBorshSchema for HashMap<K, V> {
    fn borsh_schema() -> BorshSchema {
        BorshSchema::Map {
            key: Box::new(K::borsh_schema().clone()),
            value: Box::new(V::borsh_schema().clone()),
        }
    }
}