data.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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(InternalError::DeserializeFromBytes(format!("{}", e)).into())),
  34. },
  35. }
  36. }
  37. }
  38. impl<T> Responder for Data<T>
  39. where
  40. T: ToBytes,
  41. {
  42. fn respond_to(self, _request: &EventRequest) -> EventResponse {
  43. match self.into_inner().into_bytes() {
  44. Ok(bytes) => ResponseBuilder::Ok().data(bytes).build(),
  45. Err(e) => e.into(),
  46. }
  47. }
  48. }
  49. impl<T> std::convert::TryFrom<&Payload> for Data<T>
  50. where
  51. T: FromBytes,
  52. {
  53. type Error = DispatchError;
  54. fn try_from(payload: &Payload) -> Result<Data<T>, Self::Error> { parse_payload(payload) }
  55. }
  56. impl<T> std::convert::TryFrom<Payload> for Data<T>
  57. where
  58. T: FromBytes,
  59. {
  60. type Error = DispatchError;
  61. fn try_from(payload: Payload) -> Result<Data<T>, Self::Error> { parse_payload(&payload) }
  62. }
  63. fn parse_payload<T>(payload: &Payload) -> Result<Data<T>, DispatchError>
  64. where
  65. T: FromBytes,
  66. {
  67. match payload {
  68. Payload::None => Err(InternalError::UnexpectedNone("Parse fail, expected payload".to_string()).into()),
  69. Payload::Bytes(bytes) => {
  70. let data = T::parse_from_bytes(bytes.clone())?;
  71. Ok(Data(data))
  72. },
  73. }
  74. }
  75. impl<T> std::convert::TryInto<Payload> for Data<T>
  76. where
  77. T: ToBytes,
  78. {
  79. type Error = DispatchError;
  80. fn try_into(self) -> Result<Payload, Self::Error> {
  81. let inner = self.into_inner();
  82. let bytes = inner.into_bytes()?;
  83. Ok(Payload::Bytes(bytes))
  84. }
  85. }
  86. impl ToBytes for Data<String> {
  87. fn into_bytes(self) -> Result<Bytes, DispatchError> { Ok(Bytes::from(self.0)) }
  88. }