1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
use sys::{self, VALUE, T_FIXNUM, T_BIGNUM}; use super::{UncheckedValue, CheckResult, CheckedValue, ToRust, ToRuby}; impl UncheckedValue<u64> for VALUE { fn to_checked(self) -> CheckResult<u64> { if unsafe { sys::RB_TYPE_P(self, T_FIXNUM) || sys::RB_TYPE_P(self, T_BIGNUM) } { Ok(unsafe { CheckedValue::new(self) }) } else { let val = unsafe { CheckedValue::<String>::new(sys::rb_inspect(self)) }; Err(format!("No implicit conversion of {} into Rust u64", val.to_rust())) } } } impl ToRust<u64> for CheckedValue<u64> { fn to_rust(self) -> u64 { unsafe { sys::NUM2U64(self.inner) } } } impl ToRuby for u64 { fn to_ruby(self) -> VALUE { unsafe { sys::U642NUM(self) } } } impl UncheckedValue<i64> for VALUE { fn to_checked(self) -> CheckResult<i64> { if unsafe { sys::RB_TYPE_P(self, sys::T_FIXNUM) || sys::RB_TYPE_P(self, sys::T_BIGNUM) } { Ok(unsafe { CheckedValue::new(self) }) } else { let val = unsafe { CheckedValue::<String>::new(sys::rb_inspect(self)) }; Err(format!("No implicit conversion of {} into Rust i64", val.to_rust())) } } } impl ToRust<i64> for CheckedValue<i64> { fn to_rust(self) -> i64 { unsafe { sys::NUM2I64(self.inner) } } } impl ToRuby for i64 { fn to_ruby(self) -> VALUE { unsafe { sys::I642NUM(self) } } } impl UncheckedValue<u32> for VALUE { fn to_checked(self) -> CheckResult<u32> { if unsafe { sys::RB_TYPE_P(self, T_FIXNUM) || sys::RB_TYPE_P(self, T_BIGNUM) } { Ok(unsafe { CheckedValue::new(self) }) } else { let val = unsafe { CheckedValue::<String>::new(sys::rb_inspect(self)) }; Err(format!("No implicit conversion of {} into Rust u32", val.to_rust())) } } } impl ToRust<u32> for CheckedValue<u32> { fn to_rust(self) -> u32 { unsafe { sys::NUM2U32(self.inner) } } } impl ToRuby for u32 { fn to_ruby(self) -> VALUE { unsafe { sys::U322NUM(self) } } } impl UncheckedValue<i32> for VALUE { fn to_checked(self) -> CheckResult<i32> { if unsafe { sys::RB_TYPE_P(self, sys::T_FIXNUM) || sys::RB_TYPE_P(self, sys::T_BIGNUM) } { Ok(unsafe { CheckedValue::new(self) }) } else { let val = unsafe { CheckedValue::<String>::new(sys::rb_inspect(self)) }; Err(format!("No implicit conversion of {} into Rust i32", val.to_rust())) } } } impl ToRust<i32> for CheckedValue<i32> { fn to_rust(self) -> i32 { unsafe { sys::NUM2I32(self.inner) } } } impl ToRuby for i32 { fn to_ruby(self) -> VALUE { unsafe { sys::I322NUM(self) } } }