data.rs 2.6 KB

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