1use std::ffi::CStr;
2use std::convert::TryInto;
3
4#[derive(Debug)]
5pub enum TypedValue<'a> {
6 I8(&'a [i8]),
7 U8(&'a [u8]),
8 I16(&'a [i16]),
9 U16(&'a [u16]),
10 I32(&'a [i32]),
11 U32(&'a [u32]),
12 F(&'a [f32]),
13 Str(&'a CStr),
14 SStr(&'a [u8]),
15 Null,
16}
17
18impl <'a> TypedValue<'a> {
19 fn cast_int<T: TryInto<i64> + Copy>(slice: &[T], idx: usize) -> Option<i64> {
20 let value = *slice.get(idx)?;
21 value.try_into().ok()
22 }
23 pub fn get_int(&self, idx: usize) -> Option<i64> {
24 use TypedValue::*;
25 match self {
26 I8(v) => Self::cast_int(v, idx),
27 U8(v) => Self::cast_int(v, idx),
28 I16(v) => Self::cast_int(v, idx),
29 U16(v) => Self::cast_int(v, idx),
30 I32(v) => Self::cast_int(v, idx),
31 U32(v) => Self::cast_int(v, idx),
32 _ => None
33 }
34 }
35}