pub const MAGIC : u32 = 0xa1b2c3d4;
pub const VERSION_2 : u32 = 2;
pub const VERSION : u32 = VERSION_2;
pub const MAP_TABLE_SIZE : usize = 640;
pub const PROD_ACCT_SIZE : usize = 512;
pub const PROD_HDR_SIZE : usize = 48;
pub const PROD_ATTR_SIZE : usize = PROD_ACCT_SIZE - PROD_HDR_SIZE;
#[repr(C)]
pub enum AccountType
{
Unknown,
Mapping,
Product,
Price
}
#[repr(C)]
pub enum PriceStatus
{
Unknown,
Trading,
Halted,
Auction
}
#[repr(C)]
pub enum CorpAction
{
NoCorpAct
}
#[repr(C)]
pub enum PriceType
{
Unknown,
Price
}
#[repr(C)]
pub struct AccKey
{
pub val: [u8;32]
}
#[repr(C)]
pub struct Mapping
{
pub magic : u32, pub ver : u32, pub atype : u32, pub size : u32, pub num : u32, pub unused : u32,
pub next : AccKey, pub products : [AccKey;MAP_TABLE_SIZE]
}
#[repr(C)]
pub struct Product
{
pub magic : u32, pub ver : u32, pub atype : u32, pub size : u32, pub px_acc : AccKey, pub attr : [u8;PROD_ATTR_SIZE] }
#[repr(C)]
pub struct PriceInfo
{
pub price : i64, pub conf : u64, pub status : PriceStatus, pub corp_act : CorpAction, pub pub_slot : u64
}
#[repr(C)]
pub struct PriceComp
{
publisher : AccKey, agg : PriceInfo, latest : PriceInfo }
#[repr(C)]
pub struct Price
{
pub magic : u32, pub ver : u32, pub atype : u32, pub size : u32, pub ptype : PriceType, pub expo : i32, pub num : u32, pub unused : u32,
pub curr_slot : u64, pub valid_slot : u64, pub twap : i64, pub avol : u64, pub drv0 : i64, pub drv1 : i64, pub drv2 : i64, pub drv3 : i64, pub drv4 : i64, pub drv5 : i64, pub prod : AccKey, pub next : AccKey, pub agg_pub : AccKey, pub agg : PriceInfo, pub comp : [PriceComp;32] }
struct AccKeyU64
{
pub val: [u64;4]
}
pub fn cast<T>( d: &[u8] ) -> &T {
let (_, pxa, _) = unsafe { d.align_to::<T>() };
&pxa[0]
}
impl AccKey
{
pub fn is_valid( &self ) -> bool {
let k8 = cast::<AccKeyU64>( &self.val );
return k8.val[0]!=0 || k8.val[1]!=0 || k8.val[2]!=0 || k8.val[3]!=0;
}
}