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