data.rs 2.6 KB

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