Guest User

Untitled

a guest
Jul 18th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. pub struct JsValue;
  2.  
  3. impl AsRef<JsValue> for JsValue {
  4. fn as_ref(&self) -> &JsValue {
  5. self
  6. }
  7. }
  8.  
  9. impl AsMut<JsValue> for JsValue {
  10. fn as_mut(&mut self) -> &mut JsValue {
  11. self
  12. }
  13. }
  14.  
  15. pub trait InstanceOf: Into<JsValue> {
  16. fn instanceof(val: &JsValue) -> bool;
  17.  
  18. fn unchecked_from_js(val: JsValue) -> Self;
  19. fn unchecked_from_js_ref(val: &JsValue) -> &Self;
  20. fn unchecked_from_js_mut(val: &mut JsValue) -> &mut Self;
  21. }
  22.  
  23. pub trait Cast
  24. where
  25. Self: AsRef<JsValue> + AsMut<JsValue> + Into<JsValue>,
  26. {
  27. // Unchecked conversions.
  28.  
  29. fn unchecked_into<T>(self) -> T
  30. where
  31. T: InstanceOf,
  32. {
  33. T::unchecked_from_js(self.into())
  34. }
  35. fn unchecked_ref<T>(&self) -> &T
  36. where
  37. T: InstanceOf,
  38. {
  39. T::unchecked_from_js_ref(self.as_ref())
  40. }
  41. fn unchecked_mut<T>(&mut self) -> &mut T
  42. where
  43. T: InstanceOf,
  44. {
  45. T::unchecked_from_js_mut(self.as_mut())
  46. }
  47.  
  48. // Dynamic instanceof check.
  49.  
  50. fn is_instance_of<T>(&self) -> bool
  51. where
  52. T: InstanceOf,
  53. {
  54. T::instanceof(self.as_ref())
  55. }
  56.  
  57. // Dynamically-checked conversions.
  58.  
  59. fn try_into<T>(self) -> Result<T, Self>
  60. where
  61. T: InstanceOf,
  62. {
  63. if self.is_instance_of::<T>() {
  64. Ok(self.unchecked_into())
  65. } else {
  66. Err(self)
  67. }
  68. }
  69.  
  70. fn try_ref<T>(&self) -> Option<&T>
  71. where
  72. T: InstanceOf,
  73. {
  74. if self.is_instance_of::<T>() {
  75. Some(self.unchecked_ref())
  76. } else {
  77. None
  78. }
  79. }
  80.  
  81. fn try_mut<T>(&mut self) -> Option<&mut T>
  82. where
  83. T: InstanceOf,
  84. {
  85. if self.is_instance_of::<T>() {
  86. Some(self.unchecked_mut())
  87. } else {
  88. None
  89. }
  90. }
  91. }
  92.  
  93. impl<U> Cast for U where U: AsRef<JsValue> + AsMut<JsValue> + Into<JsValue> {}
  94.  
  95. struct Object;
  96.  
  97. impl InstanceOf for Object {
  98. fn instanceof(_val: &JsValue) -> bool {
  99. unimplemented!()
  100. }
  101. fn unchecked_from_js(_val: JsValue) -> Self {
  102. unimplemented!()
  103. }
  104. fn unchecked_from_js_ref(_val: &JsValue) -> &Self {
  105. unimplemented!()
  106. }
  107. fn unchecked_from_js_mut(_val: &mut JsValue) -> &mut Self {
  108. unimplemented!()
  109. }
  110. }
  111.  
  112. impl From<Object> for JsValue {
  113. fn from(_o: Object) -> JsValue {
  114. unimplemented!()
  115. }
  116. }
  117.  
  118. impl AsRef<JsValue> for Object {
  119. fn as_ref(&self) -> &JsValue {
  120. unimplemented!()
  121. }
  122. }
  123.  
  124. impl AsMut<JsValue> for Object {
  125. fn as_mut(&mut self) -> &mut JsValue {
  126. unimplemented!()
  127. }
  128. }
  129.  
  130. fn main() {
  131. let v = JsValue;
  132. v.is_instance_of::<Object>();
  133. }
Add Comment
Please, Sign In to add comment