• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2023 Huawei Device Co., Ltd.
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 //     http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 /// Builds a `MimePart`.
15 macro_rules! part_build {
16     (
17         MimePart: {
18             $(Headers: $headers: expr,)?
19             $(Header: $name: expr, $value: expr,)*
20             $(BodyOwned: $body1: expr,)?
21             $(BodySlice: $body2: expr,)?
22             $(BodyReader: $body3: expr,)?
23             $(BodyAsyncReader: $body4: expr,)?
24         },
25     ) => {
26         MimePart::builder()
27             $(.set_headers($headers))?
28             $(.header($name, $value))*
29             $(.body_from_owned($body1))?
30             $(.body_from_bytes($body2))?
31             $(.body_from_reader($body3))?
32             $(.body_from_async_reader($body4))?
33             .build()
34             .expect("MimePart build failed")
35     }
36 }
37 
38 /// Builds a `MimePart`, encodes it, Compares with result.
39 macro_rules! part_encode_compare {
40     (
41         MimePart: {
42             $(Headers: $headers: expr,)?
43             $(Header: $name: expr, $value: expr,)*
44             $(BodyOwned: $body1: expr,)?
45             $(BodySlice: $body2: expr,)?
46             $(BodyReader: $body3: expr,)?
47             $(BodyAsyncReader: $body4: expr,)?
48         },
49         $(BufSize: $size: expr,)?
50         $(ResultSize: $v_size: expr,)?
51         $(ResultData: $v_data: expr,)?
52         Sync,
53     ) => {
54         let part = part_build!(
55             MimePart: {
56                 $(Headers: $headers: expr,)?
57                 $(Header: $name, $value,)*
58                 $(BodyOwned: $body1,)?
59                 $(BodySlice: $body2,)?
60                 $(BodyReader: $body3,)?
61                 $(BodyAsyncReader: $body4,)?
62             },
63         );
64 
65         // default 1
66         #[allow(unused_assignments, unused_mut)]
67         let mut len = 1;
68 
69         $(len = $size;)?
70         let mut buf = vec![0u8; len];
71         let mut v_data = vec![];
72         let mut v_size = vec![];
73         let mut part_encoder = MimePartEncoder::from_part(part);
74 
75         loop {
76             let size = sync_impl::Body::data(&mut part_encoder, &mut buf).expect("MimePart encode failed");
77             if size == 0 {
78                 break;
79             }
80             v_size.push(size);
81             v_data.extend_from_slice(&buf[..size]);
82         }
83         $(assert_eq!(v_size, $v_size);)?
84         $(assert_eq!(v_data, $v_data);)?
85     };
86 
87     (
88         MimePart: {
89             $(Headers: $headers: expr,)?
90             $(Header: $name: expr, $value: expr,)*
91             $(BodyOwned: $body1: expr,)?
92             $(BodySlice: $body2: expr,)?
93             $(BodyReader: $body3: expr,)?
94             $(BodyAsyncReader: $body4: expr,)?
95         },
96         $(BufSize: $size: expr,)?
97         $(ResultSize: $v_size: expr,)?
98         $(ResultData: $v_data: expr,)?
99         Async,
100     ) => {
101         let part = part_build!(
102             MimePart: {
103                 $(Headers: $headers: expr,)?
104                 $(Header: $name, $value,)*
105                 $(BodyOwned: $body1,)?
106                 $(BodySlice: $body2,)?
107                 $(BodyReader: $body3,)?
108                 $(BodyAsyncReader: $body4,)?
109             },
110         );
111         // default 1
112         #[allow(unused_assignments, unused_mut)]
113         let mut len = 1;
114 
115         $(len = $size;)?
116         let mut buf = vec![0u8; len];
117         let mut v_data = vec![];
118         let mut v_size = vec![];
119         let mut part_encoder = MimePartEncoder::from_part(part);
120 
121         loop {
122             // async
123             let size = async_impl::Body::data(&mut part_encoder, &mut buf).await.expect("MimePart encode failed");
124             if size == 0 {
125                 break;
126             }
127             v_size.push(size);
128             v_data.extend_from_slice(&buf[..size]);
129         }
130         $(assert_eq!(v_size, $v_size);)?
131         $(assert_eq!(v_data, $v_data);)?
132     };
133 }
134