1use deboa::{
2 errors::{ContentError, DeboaError},
3 request::DeboaRequestBuilder,
4 response::DeboaResponse,
5 Result,
6};
7use fory::{Fory, ForyDefault, Serializer};
8use http::header;
9
10#[cfg(test)]
11mod tests;
12
13pub trait ForyRequestBuilder {
14 fn body_as_fory<T: Serializer>(self, fory: &Fory, body: T) -> Result<DeboaRequestBuilder>;
15}
16
17impl ForyRequestBuilder for DeboaRequestBuilder {
18 fn body_as_fory<T: Serializer>(self, fory: &Fory, body: T) -> Result<DeboaRequestBuilder> {
19 let result = fory.serialize(&body);
20 if let Err(error) = result {
21 return Err(DeboaError::Content(ContentError::Serialization {
22 message: error.to_string(),
23 }));
24 }
25
26 let builder = self
27 .raw_body(&result.unwrap())
28 .header(header::CONTENT_TYPE, "application/fory");
29
30 Ok(builder)
31 }
32}
33
34#[deboa::async_trait]
35pub trait ForyResponse {
36 async fn body_as_fory<T: Serializer + ForyDefault>(&mut self, fory: &Fory) -> Result<T>;
37}
38
39#[deboa::async_trait]
40impl ForyResponse for DeboaResponse {
41 async fn body_as_fory<T: Serializer + ForyDefault>(&mut self, fory: &Fory) -> Result<T> {
42 let result = fory.deserialize(
43 &self
44 .raw_body()
45 .await,
46 );
47 if let Err(error) = result {
48 return Err(DeboaError::Content(ContentError::Deserialization {
49 message: error.to_string(),
50 }));
51 }
52
53 Ok(result.unwrap())
54 }
55}