mod.rs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #[macro_export]
  2. macro_rules! get_handle_from_ptr {
  3. ($hptr:ident as $hval:ident) => {
  4. if $hptr.is_null() {
  5. return ZRFUErrNo::Generic_NullPointerHandle.get_return_code()
  6. };
  7. let $hval = unsafe { $hptr.read() };
  8. }
  9. }
  10. #[macro_export]
  11. macro_rules! define_err_enum {
  12. ($( $behv:ident for $prefix:ident as $name:ident ), * ) => {
  13. #[allow(non_camel_case_types)]
  14. #[derive(Debug, TryFromPrimitive, IntoPrimitive, Display)]
  15. #[repr(u32)]
  16. pub enum ZRFUErrNo {
  17. OK = 0x00000000,
  18. Unknown = 0x4000FFFF,
  19. $(
  20. $name = ZRFUErrPrefix::$prefix.define(ZRFUErrBehavior::$behv),
  21. )*
  22. }
  23. }
  24. }
  25. #[macro_export]
  26. macro_rules! proc_def_ar {
  27. ( $proc_name:ident ($args_type:ty as $argname:ident ; $ret_type:ty as $retname:ident) $code:block ) => {
  28. pub struct $proc_name {
  29. proc_name: String,
  30. args: ZRFUProcArgs<$args_type>,
  31. ret: ZRFUProcReturn<$ret_type>,
  32. }
  33. impl ZRFUProcInstanceTrait for $proc_name {
  34. fn decode_input(&mut self, bv: &mut ZRFUBytesVec) -> ZRFUProcResultCode {
  35. self.args.cbor_deserialize(bv)
  36. }
  37. fn call(&mut self) -> ZRFUProcResultCode {
  38. let $argname = match self.args.get_data() {
  39. None => { return ZRFUProcResultCode::CanNotGetArgs; },
  40. Some(t) => t,
  41. };
  42. $code;
  43. self.ret.set_data($retname);
  44. return ZRFUProcResultCode::Ok;
  45. }
  46. fn encode_return(&mut self, bv: &mut ZRFUBytesVec) -> ZRFUProcResultCode {
  47. self.ret.cbor_serialize(bv)
  48. }
  49. }
  50. impl $proc_name {
  51. fn factory(name: String) -> Box<dyn ZRFUProcInstanceTrait> {
  52. Box::new($proc_name{
  53. proc_name: name,
  54. args: ZRFUProcArgs::new(),
  55. ret: ZRFUProcReturn::new(),
  56. })
  57. }
  58. }
  59. };
  60. }
  61. #[macro_export]
  62. macro_rules! proc_def_a {
  63. ( $proc_name:ident ($args_type:ty as $argname:ident) $code:block ) => {
  64. pub struct $proc_name {
  65. proc_name: String,
  66. args: ZRFUProcArgs<$args_type>,
  67. }
  68. impl ZRFUProcInstanceTrait for $proc_name {
  69. fn decode_input(&mut self, bv: &mut ZRFUBytesVec) -> ZRFUProcResultCode {
  70. self.args.cbor_deserialize(bv)
  71. }
  72. fn call(&mut self) -> ZRFUProcResultCode {
  73. let $argname = match self.args.get_data() {
  74. None => { return ZRFUProcResultCode::CanNotGetArgs; },
  75. Some(t) => t,
  76. };
  77. $code;
  78. return ZRFUProcResultCode::Ok;
  79. }
  80. fn encode_return(&mut self, bv: &mut ZRFUBytesVec) -> ZRFUProcResultCode {
  81. ZRFUProcResultCode::NoReturnProvided
  82. }
  83. }
  84. impl $proc_name {
  85. fn factory(name: String) -> Box<dyn ZRFUProcInstanceTrait> {
  86. Box::new($proc_name{
  87. proc_name: name,
  88. args: ZRFUProcArgs::new(),
  89. })
  90. }
  91. }
  92. };
  93. }
  94. #[macro_export]
  95. macro_rules! proc_def_r {
  96. ( $proc_name:ident ($ret_type:ty as $retname:ident) $code:block ) => {
  97. pub struct $proc_name {
  98. proc_name: String,
  99. ret: ZRFUProcReturn<$ret_type>,
  100. }
  101. impl ZRFUProcInstanceTrait for $proc_name {
  102. fn decode_input(&mut self, bv: &mut ZRFUBytesVec) -> ZRFUProcResultCode {
  103. ZRFUProcResultCode::NoArgsNeed
  104. }
  105. fn call(&mut self) -> ZRFUProcResultCode {
  106. $code;
  107. self.ret.set_data($retname);
  108. return ZRFUProcResultCode::Ok;
  109. }
  110. fn encode_return(&mut self, bv: &mut ZRFUBytesVec) -> ZRFUProcResultCode {
  111. self.ret.cbor_serialize(bv)
  112. }
  113. }
  114. impl $proc_name {
  115. fn factory(name: String) -> Box<dyn ZRFUProcInstanceTrait> {
  116. Box::new($proc_name{
  117. proc_name: name,
  118. ret: ZRFUProcReturn::new(),
  119. })
  120. }
  121. }
  122. };
  123. }
  124. #[macro_export]
  125. macro_rules! proc_def_n {
  126. ( $proc_name:ident () $code:block ) => {
  127. pub struct $proc_name {
  128. proc_name: String,
  129. }
  130. impl ZRFUProcInstanceTrait for $proc_name {
  131. fn decode_input(&mut self, bv: &mut ZRFUBytesVec) -> ZRFUProcResultCode {
  132. ZRFUProcResultCode::NoArgsNeed
  133. }
  134. fn call(&mut self) -> ZRFUProcResultCode {
  135. $code;
  136. return ZRFUProcResultCode::Ok;
  137. }
  138. fn encode_return(&mut self, bv: &mut ZRFUBytesVec) -> ZRFUProcResultCode {
  139. ZRFUProcResultCode::NoReturnProvided
  140. }
  141. }
  142. impl $proc_name {
  143. fn factory(name: String) -> Box<dyn ZRFUProcInstanceTrait> {
  144. Box::new($proc_name{
  145. proc_name: name,
  146. })
  147. }
  148. }
  149. };
  150. }