util.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. pub trait SafeToU8 {
  2. fn safe_to_u8(self) -> u8;
  3. }
  4. pub trait SafeToU16 {
  5. fn safe_to_u16(self) -> u16;
  6. }
  7. pub trait SafeToI32 {
  8. fn safe_to_i32(self) -> i32;
  9. }
  10. impl SafeToU8 for u16 {
  11. fn safe_to_u8(self) -> u8 {
  12. dbg_assert!(self <= ::std::u8::MAX as u16);
  13. self as u8
  14. }
  15. }
  16. impl SafeToU8 for u32 {
  17. fn safe_to_u8(self) -> u8 {
  18. dbg_assert!(self <= ::std::u8::MAX as u32);
  19. self as u8
  20. }
  21. }
  22. impl SafeToU8 for i32 {
  23. fn safe_to_u8(self) -> u8 {
  24. dbg_assert!(self >= 0 && self <= ::std::u8::MAX as i32);
  25. self as u8
  26. }
  27. }
  28. impl SafeToU8 for usize {
  29. fn safe_to_u8(self) -> u8 {
  30. dbg_assert!(self <= ::std::u8::MAX as usize);
  31. self as u8
  32. }
  33. }
  34. impl SafeToU16 for u32 {
  35. fn safe_to_u16(self) -> u16 {
  36. dbg_assert!(self <= ::std::u16::MAX as u32);
  37. self as u16
  38. }
  39. }
  40. impl SafeToU16 for i32 {
  41. fn safe_to_u16(self) -> u16 {
  42. dbg_assert!(self >= 0 && self <= ::std::u16::MAX as i32);
  43. self as u16
  44. }
  45. }
  46. impl SafeToU16 for usize {
  47. fn safe_to_u16(self) -> u16 {
  48. dbg_assert!(self <= ::std::u16::MAX as usize);
  49. self as u16
  50. }
  51. }
  52. impl SafeToI32 for u32 {
  53. fn safe_to_i32(self) -> i32 {
  54. dbg_assert!(self <= ::std::i32::MAX as u32);
  55. self as i32
  56. }
  57. }
  58. impl SafeToI32 for usize {
  59. fn safe_to_i32(self) -> i32 {
  60. dbg_assert!(self <= ::std::i32::MAX as usize);
  61. self as i32
  62. }
  63. }
  64. #[allow(dead_code)]
  65. pub const DEBUG: bool = cfg!(debug_assertions);
  66. #[cfg(target_arch = "wasm32")]
  67. extern "C" {
  68. pub fn log_from_wasm(ptr: *const u8, len: usize);
  69. pub fn console_log_from_wasm(ptr: *const u8, len: usize);
  70. pub fn abort();
  71. }
  72. extern "C" {
  73. pub fn dbg_trace_from_wasm();
  74. }
  75. #[cfg(target_arch = "wasm32")]
  76. use std::string::ToString;
  77. #[cfg(target_arch = "wasm32")]
  78. pub fn log_to_js_console<T: ToString>(s: T) {
  79. let s: String = s.to_string();
  80. let len = s.len();
  81. unsafe {
  82. log_from_wasm(s.as_bytes().as_ptr(), len);
  83. }
  84. }
  85. #[cfg(target_arch = "wasm32")]
  86. pub fn console_log_to_js_console<T: ToString>(s: T) {
  87. let s: String = s.to_string();
  88. let len = s.len();
  89. unsafe {
  90. console_log_from_wasm(s.as_bytes().as_ptr(), len);
  91. }
  92. }
  93. pub fn dbg_trace() {
  94. if DEBUG {
  95. unsafe {
  96. dbg_trace_from_wasm();
  97. }
  98. }
  99. }