mod.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #![allow(
  2. clippy::no_effect_underscore_binding,
  3. clippy::too_many_lines,
  4. clippy::used_underscore_binding
  5. )]
  6. #[rustfmt::skip]
  7. mod gen;
  8. use proc_macro2::{Ident, Literal, TokenStream};
  9. use ref_cast::RefCast;
  10. use std::fmt::{self, Debug};
  11. use std::ops::Deref;
  12. use syn::punctuated::Punctuated;
  13. #[derive(RefCast)]
  14. #[repr(transparent)]
  15. pub struct Lite<T: ?Sized> {
  16. value: T,
  17. }
  18. #[allow(non_snake_case)]
  19. pub fn Lite<T: ?Sized>(value: &T) -> &Lite<T> {
  20. Lite::ref_cast(value)
  21. }
  22. impl<T: ?Sized> Deref for Lite<T> {
  23. type Target = T;
  24. fn deref(&self) -> &Self::Target {
  25. &self.value
  26. }
  27. }
  28. impl Debug for Lite<bool> {
  29. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  30. write!(formatter, "{}", self.value)
  31. }
  32. }
  33. impl Debug for Lite<u32> {
  34. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  35. write!(formatter, "{}", self.value)
  36. }
  37. }
  38. impl Debug for Lite<usize> {
  39. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  40. write!(formatter, "{}", self.value)
  41. }
  42. }
  43. impl Debug for Lite<String> {
  44. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  45. write!(formatter, "{:?}", self.value)
  46. }
  47. }
  48. impl Debug for Lite<Ident> {
  49. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  50. write!(formatter, "{:?}", self.value.to_string())
  51. }
  52. }
  53. impl Debug for Lite<Literal> {
  54. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  55. write!(formatter, "{}", self.value)
  56. }
  57. }
  58. impl Debug for Lite<TokenStream> {
  59. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  60. let string = self.value.to_string();
  61. if string.len() <= 80 {
  62. write!(formatter, "TokenStream(`{}`)", self.value)
  63. } else {
  64. formatter
  65. .debug_tuple("TokenStream")
  66. .field(&format_args!("`{}`", string))
  67. .finish()
  68. }
  69. }
  70. }
  71. impl<'a, T> Debug for Lite<&'a T>
  72. where
  73. Lite<T>: Debug,
  74. {
  75. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  76. Debug::fmt(Lite(&*self.value), formatter)
  77. }
  78. }
  79. impl<T> Debug for Lite<Box<T>>
  80. where
  81. Lite<T>: Debug,
  82. {
  83. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  84. Debug::fmt(Lite(&*self.value), formatter)
  85. }
  86. }
  87. impl<T> Debug for Lite<Vec<T>>
  88. where
  89. Lite<T>: Debug,
  90. {
  91. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  92. formatter
  93. .debug_list()
  94. .entries(self.value.iter().map(Lite))
  95. .finish()
  96. }
  97. }
  98. impl<T, P> Debug for Lite<Punctuated<T, P>>
  99. where
  100. Lite<T>: Debug,
  101. {
  102. fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  103. formatter
  104. .debug_list()
  105. .entries(self.value.iter().map(Lite))
  106. .finish()
  107. }
  108. }