macros.rs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #[macro_export]
  2. macro_rules! impl_sql_binary_expression {
  3. ($target:ident) => {
  4. impl diesel::serialize::ToSql<diesel::sql_types::Binary, diesel::sqlite::Sqlite>
  5. for $target
  6. {
  7. fn to_sql<W: std::io::Write>(
  8. &self,
  9. out: &mut diesel::serialize::Output<W, diesel::sqlite::Sqlite>,
  10. ) -> diesel::serialize::Result {
  11. let bytes: Vec<u8> = self.try_into().map_err(|e| format!("{:?}", e))?;
  12. diesel::serialize::ToSql::<diesel::sql_types::Binary,diesel::sqlite::Sqlite,>::to_sql(&bytes, out)
  13. }
  14. }
  15. // https://docs.diesel.rs/src/diesel/sqlite/types/mod.rs.html#30-33
  16. // impl FromSql<sql_types::Binary, Sqlite> for *const [u8] {
  17. // fn from_sql(bytes: Option<&SqliteValue>) -> deserialize::Result<Self> {
  18. // let bytes = not_none!(bytes).read_blob();
  19. // Ok(bytes as *const _)
  20. // }
  21. // }
  22. impl<DB> diesel::deserialize::FromSql<diesel::sql_types::Binary, DB> for $target
  23. where
  24. DB: diesel::backend::Backend,
  25. *const [u8]: diesel::deserialize::FromSql<diesel::sql_types::Binary, DB>,
  26. {
  27. fn from_sql(bytes: Option<&DB::RawValue>) -> diesel::deserialize::Result<Self> {
  28. let slice_ptr = <*const [u8] as diesel::deserialize::FromSql<
  29. diesel::sql_types::Binary,
  30. DB,
  31. >>::from_sql(bytes)?;
  32. let bytes = unsafe { &*slice_ptr };
  33. match $target::try_from(bytes) {
  34. Ok(object) => Ok(object),
  35. Err(e) => {
  36. log::error!(
  37. "{:?} deserialize from bytes fail. {:?}",
  38. std::any::type_name::<$target>(),
  39. e
  40. );
  41. panic!();
  42. },
  43. }
  44. }
  45. }
  46. };
  47. }
  48. #[macro_export]
  49. macro_rules! impl_sql_integer_expression {
  50. ($target:ident) => {
  51. use diesel::{
  52. deserialize,
  53. deserialize::FromSql,
  54. serialize,
  55. serialize::{Output, ToSql},
  56. };
  57. use std::io::Write;
  58. impl<DB> ToSql<Integer, DB> for $target
  59. where
  60. DB: diesel::backend::Backend,
  61. i32: ToSql<Integer, DB>,
  62. {
  63. fn to_sql<W: Write>(&self, out: &mut Output<W, DB>) -> serialize::Result {
  64. (*self as i32).to_sql(out)
  65. }
  66. }
  67. impl<DB> FromSql<Integer, DB> for $target
  68. where
  69. DB: diesel::backend::Backend,
  70. i32: FromSql<Integer, DB>,
  71. {
  72. fn from_sql(bytes: Option<&DB::RawValue>) -> deserialize::Result<Self> {
  73. let smaill_int = i32::from_sql(bytes)?;
  74. Ok($target::from(smaill_int))
  75. }
  76. }
  77. };
  78. }
  79. // #[macro_export]
  80. // macro_rules! impl_save_func {
  81. // ($func_name:ident, $target:ident, $table_name:expr, $conn:ident) => {
  82. // fn $func_name(object: $target) -> Result<(), WorkspaceError> {
  83. // let _ = diesel::insert_into($table_name)
  84. // .values($target)
  85. // .execute(&*($conn))?;
  86. // }
  87. // };
  88. // }
  89. #[macro_export]
  90. macro_rules! impl_def_and_def_mut {
  91. ($target:ident, $item: ident) => {
  92. impl std::ops::Deref for $target {
  93. type Target = Vec<$item>;
  94. fn deref(&self) -> &Self::Target { &self.items }
  95. }
  96. impl std::ops::DerefMut for $target {
  97. fn deref_mut(&mut self) -> &mut Self::Target { &mut self.items }
  98. }
  99. impl $target {
  100. #[allow(dead_code)]
  101. pub fn take_items(&mut self) -> Vec<$item> {
  102. ::std::mem::replace(&mut self.items, vec![])
  103. }
  104. #[allow(dead_code)]
  105. pub fn push(&mut self, item: $item) {
  106. if self.items.contains(&item) {
  107. log::error!("add duplicate item: {:?}", item);
  108. return;
  109. }
  110. self.items.push(item);
  111. }
  112. pub fn first_or_crash(&self) -> &$item { self.items.first().unwrap() }
  113. }
  114. };
  115. }