1#[macro_export]
49macro_rules! progress {
50 ( $(None)? ; $($item:tt)+ ) => {
51 $crate::ProgressBuilder::new($crate::items!($($item)+)).build()
52 };
53
54 ( $total:expr $( ; $($item:tt)* )? ) => {
55 $crate::ProgressBuilder::new($crate::items!($($($item)*)?))
56 .total(Some($total))
57 .build()
58 };
59}
60
61#[macro_export]
94macro_rules! progress_builder {
95 ( $($item:tt)* ) => {
96 $crate::ProgressBuilder::new($crate::items!($($item)*))
97 };
98}
99
100#[macro_export]
106macro_rules! items {
107 ( $($item:tt)* ) => {
108 vec![ $( $crate::item!($item) ),* ]
109 };
110}
111
112#[macro_export]
118macro_rules! item {
119 ( bar_fill ) => {
123 $crate::internal::Item::Fill($crate::internal::FillItem::Bar)
124 };
125
126 ( eta ) => { $crate::item!(( eta "{}{}" "" )) };
130 (( eta $format:literal )) => { $crate::item!(( eta $format "" )) };
131
132 (( eta $format:literal $none:literal )) => {
133 $crate::internal::Item::Fn(Box::new(|s| {
134 if let Some(eta) = s.eta() {
135 let (amount, unit) = $crate::duration_approx(eta);
136 format!(
137 $format,
138 $crate::internal::FormatInteger::new(
139 amount,
140 s.thousands_separator()
141 ),
142 unit,
143 )
144 } else {
145 $none.to_string()
146 }
147 }))
148 };
149
150 ( eta_hms ) => {
154 $crate::internal::Item::Fn(Box::new(|s| {
155 if let Some(eta) = s.eta() {
156 let (h,m,s) = $crate::duration_hms(eta);
157 if h > 0 {
158 format!("{}:{:02}:{:02}", h, m, s)
159 } else {
160 format!("{}:{:02}", m, s)
161 }
162 } else {
163 "".to_string()
164 }
165 }))
166 };
167
168 ( message_fill ) => {
172 $crate::internal::Item::Fill($crate::internal::FillItem::Message)
173 };
174
175 ( percent ) => { $crate::item!(( percent "{:3.0}%" "" )) };
179 (( percent $format:literal )) => { $crate::item!(( percent $format "" )) };
180
181 (( percent $format:literal $none:literal )) => {
182 $crate::internal::Item::Fn(Box::new(|s| {
183 if let Some(percent) = s.percent() {
184 format!($format, $crate::internal::FormatFloat::new(percent, false))
185 } else {
186 $none.to_string()
187 }
188 }))
189 };
190
191 ( pos ) => { $crate::item!(( pos "{}" )) };
195 ( pos_group ) => { $crate::item!(( pos "{:#}" )) };
196
197 (( pos $format:literal )) => {
198 $crate::internal::Item::Fn(Box::new(|s| {
199 format!(
200 $format,
201 $crate::internal::FormatInteger::new(s.pos(), s.thousands_separator())
202 )
203 }))
204 };
205
206 ( pos_bin ) => { $crate::item!(( pos_bin "{:#} {}" )) };
210
211 (( pos_bin $format:literal )) => {
212 $crate::internal::Item::Fn(Box::new(|s| {
213 let (amount, prefix) = $crate::binary_prefix(s.pos() as f64);
214 format!(
215 $format,
216 $crate::internal::FormatFloat::new(amount, prefix == ""),
217 $crate::internal::FormatPrefix::new(prefix),
218 )
219 }))
220 };
221
222 ( pos_dec ) => { $crate::item!(( pos_dec "{:#} {}" )) };
226
227 (( pos_dec $format:literal )) => {
228 $crate::internal::Item::Fn(Box::new(|s| {
229 let (amount, prefix) = $crate::decimal_prefix(s.pos() as f64);
230 format!(
231 $format,
232 $crate::internal::FormatFloat::new(amount, prefix == ""),
233 $crate::internal::FormatPrefix::new(prefix),
234 )
235 }))
236 };
237
238 ( speed ) => { $crate::item!(( speed "{:#}" "" )) };
242 (( speed $format:literal )) => { $crate::item!(( speed $format "" )) };
243
244 (( speed $format:literal $none:literal )) => {
245 $crate::internal::Item::Fn(Box::new(|s| {
246 if let Some(speed) = s.speed() {
247 format!($format, $crate::internal::FormatFloat::new(speed, false))
248 } else {
249 $none.to_string()
250 }
251 }))
252 };
253
254 ( speed_int ) => { $crate::item!(( speed_int "{}" "" )) };
258 ( speed_group ) => { $crate::item!(( speed_int "{:#}" "" )) };
259 (( speed_int $format:literal )) => { $crate::item!(( speed_int $format "" )) };
260
261 (( speed_int $format:literal $none:literal )) => {
262 $crate::internal::Item::Fn(Box::new(|s| {
263 if let Some(speed) = s.speed() {
264 format!(
265 $format,
266 $crate::internal::FormatInteger::new(
267 speed.round() as u64,
268 s.thousands_separator(),
269 ),
270 )
271 } else {
272 $none.to_string()
273 }
274 }))
275 };
276
277 ( speed_bin ) => { $crate::item!(( speed_bin "{:#} {}" "" )) };
281 (( speed_bin $format:literal )) => { $crate::item!(( speed_bin $format "" )) };
282
283 (( speed_bin $format:literal $none:literal )) => {
284 $crate::internal::Item::Fn(Box::new(|s| {
285 if let Some(speed) = s.speed() {
286 let (amount, prefix) = $crate::binary_prefix(speed);
287 format!(
288 $format,
289 $crate::internal::FormatFloat::new(amount, false),
290 $crate::internal::FormatPrefix::new(prefix),
291 )
292 } else {
293 $none.to_string()
294 }
295 }))
296 };
297
298 ( speed_dec ) => { $crate::item!(( speed_dec "{:#} {}" "" )) };
302 (( speed_dec $format:literal )) => { $crate::item!(( speed_dec $format "" )) };
303
304 (( speed_dec $format:literal $none:literal )) => {
305 $crate::internal::Item::Fn(Box::new(|s| {
306 if let Some(speed) = s.speed() {
307 let (amount, prefix) = $crate::decimal_prefix(speed);
308 format!(
309 $format,
310 $crate::internal::FormatFloat::new(amount, false),
311 $crate::internal::FormatPrefix::new(prefix),
312 )
313 } else {
314 $none.to_string()
315 }
316 }))
317 };
318
319 ( total ) => { $crate::item!(( total "{}" "" )) };
323 ( total_group ) => { $crate::item!(( total "{:#}" "" )) };
324 (( total $format:literal )) => { $crate::item!(( total $format "" )) };
325
326 (( total $format:literal $none:literal )) => {
327 $crate::internal::Item::Fn(Box::new(|s| {
328 if let Some(total) = s.total() {
329 format!(
330 $format,
331 $crate::internal::FormatInteger::new(total, s.thousands_separator())
332 )
333 } else {
334 $none.to_string()
335 }
336 }))
337 };
338
339 ( total_bin ) => { $crate::item!(( total_bin "{:#} {}" "" )) };
343 (( total_bin $format:literal )) => { $crate::item!(( total_bin $format "" )) };
344
345 (( total_bin $format:literal $none:literal )) => {
346 $crate::internal::Item::Fn(Box::new(|s| {
347 if let Some(total) = s.total() {
348 let (amount, prefix) = $crate::binary_prefix(total as f64);
349 format!(
350 $format,
351 $crate::internal::FormatFloat::new(amount, prefix == ""),
352 $crate::internal::FormatPrefix::new(prefix),
353 )
354 } else {
355 $none.to_string()
356 }
357 }))
358 };
359
360 ( total_dec ) => { $crate::item!(( total_dec "{:#} {}" "" )) };
364 (( total_dec $format:literal )) => { $crate::item!(( total_dec $format "" )) };
365
366 (( total_dec $format:literal $none:literal )) => {
367 $crate::internal::Item::Fn(Box::new(|s| {
368 if let Some(total) = s.total() {
369 let (amount, prefix) = $crate::decimal_prefix(total as f64);
370 format!(
371 $format,
372 $crate::internal::FormatFloat::new(amount, prefix == ""),
373 $crate::internal::FormatPrefix::new(prefix),
374 )
375 } else {
376 $none.to_string()
377 }
378 }))
379 };
380
381 (( $expr:expr )) => {
385 $crate::internal::Item::Fn(Box::new($expr))
386 };
387
388 ( $literal:literal ) => {
389 $crate::internal::Item::Literal(format!("{}", $literal))
390 };
391}