data.rs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. use crate::{
  2. byte_trait::*,
  3. errors::{DispatchError, InternalError},
  4. request::{unexpected_none_payload, EventRequest, FromRequest, Payload},
  5. response::{EventResponse, Responder, ResponseBuilder},
  6. util::ready::{ready, Ready},
  7. };
  8. use bytes::Bytes;
  9. use std::ops;
  10. pub struct Data<T>(pub T);
  11. impl<T> Data<T> {
  12. pub fn into_inner(self) -> T {
  13. self.0
  14. }
  15. }
  16. impl<T> ops::Deref for Data<T> {
  17. type Target = T;
  18. fn deref(&self) -> &T {
  19. &self.0
  20. }
  21. }
  22. impl<T> ops::DerefMut for Data<T> {
  23. fn deref_mut(&mut self) -> &mut T {
  24. &mut self.0
  25. }
  26. }
  27. impl<T> FromRequest for Data<T>
  28. where
  29. T: FromBytes + 'static,
  30. {
  31. type Error = DispatchError;
  32. type Future = Ready<Result<Self, DispatchError>>;
  33. #[inline]
  34. fn from_request(req: &EventRequest, payload: &mut Payload) -> Self::Future {
  35. match payload {
  36. Payload::None => ready(Err(unexpected_none_payload(req))),
  37. Payload::Bytes(bytes) => match T::parse_from_bytes(bytes.clone()) {
  38. Ok(data) => ready(Ok(Data(data))),
  39. Err(e) => ready(Err(InternalError::DeserializeFromBytes(format!("{}", e)).into())),
  40. },
  41. }
  42. }
  43. }
  44. impl<T> Responder for Data<T>
  45. where
  46. T: ToBytes,
  47. {
  48. fn respond_to(self, _request: &EventRequest) -> EventResponse {
  49. match self.into_inner().into_bytes() {
  50. Ok(bytes) => ResponseBuilder::Ok().data(bytes).build(),
  51. Err(e) => e.into(),
  52. }
  53. }
  54. }
  55. impl<T> std::convert::TryFrom<&Payload> for Data<T>
  56. where
  57. T: FromBytes,
  58. {
  59. type Error = DispatchError;
  60. fn try_from(payload: &Payload) -> Result<Data<T>, Self::Error> {
  61. parse_payload(payload)
  62. }
  63. }
  64. impl<T> std::convert::TryFrom<Payload> for Data<T>
  65. where
  66. T: FromBytes,
  67. {
  68. type Error = DispatchError;
  69. fn try_from(payload: Payload) -> Result<Data<T>, Self::Error> {
  70. parse_payload(&payload)
  71. }
  72. }
  73. fn parse_payload<T>(payload: &Payload) -> Result<Data<T>, DispatchError>
  74. where
  75. T: FromBytes,
  76. {
  77. match payload {
  78. Payload::None => Err(InternalError::UnexpectedNone("Parse fail, expected payload".to_string()).into()),
  79. Payload::Bytes(bytes) => {
  80. let data = T::parse_from_bytes(bytes.clone())?;
  81. Ok(Data(data))
  82. }
  83. }
  84. }
  85. impl<T> std::convert::TryInto<Payload> for Data<T>
  86. where
  87. T: ToBytes,
  88. {
  89. type Error = DispatchError;
  90. fn try_into(self) -> Result<Payload, Self::Error> {
  91. let inner = self.into_inner();
  92. let bytes = inner.into_bytes()?;
  93. Ok(Payload::Bytes(bytes))
  94. }
  95. }
  96. impl ToBytes for Data<String> {
  97. fn into_bytes(self) -> Result<Bytes, DispatchError> {
  98. Ok(Bytes::from(self.0))
  99. }
  100. }