#[macro_export]
macro_rules! progress {
( $(None)? ; $($item:tt)+ ) => {
$crate::ProgressBuilder::new($crate::items!($($item)+)).build()
};
( $total:expr $( ; $($item:tt)* )? ) => {
$crate::ProgressBuilder::new($crate::items!($($($item)*)?))
.total(Some($total))
.build()
};
}
#[macro_export]
macro_rules! progress_builder {
( $($item:tt)* ) => {
$crate::ProgressBuilder::new($crate::items!($($item)*))
};
}
#[macro_export]
macro_rules! items {
( $($item:tt)* ) => {
vec![ $( $crate::item!($item) ),* ]
};
}
#[macro_export]
macro_rules! item {
( bar_fill ) => {
$crate::internal::Item::Fill($crate::internal::FillItem::Bar)
};
( eta ) => { $crate::item!(( eta "{}{}" "" )) };
(( eta $format:literal )) => { $crate::item!(( eta $format "" )) };
(( eta $format:literal $none:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
if let Some(eta) = s.eta() {
let (amount, unit) = $crate::duration_approx(eta);
format!(
$format,
$crate::internal::FormatInteger::new(
amount,
s.thousands_separator()
),
unit,
)
} else {
$none.to_string()
}
}))
};
( eta_hms ) => {
$crate::internal::Item::Fn(Box::new(|s| {
if let Some(eta) = s.eta() {
let (h,m,s) = $crate::duration_hms(eta);
if h > 0 {
format!("{}:{:02}:{:02}", h, m, s)
} else {
format!("{}:{:02}", m, s)
}
} else {
"".to_string()
}
}))
};
( message_fill ) => {
$crate::internal::Item::Fill($crate::internal::FillItem::Message)
};
( percent ) => { $crate::item!(( percent "{:3.0}%" "" )) };
(( percent $format:literal )) => { $crate::item!(( percent $format "" )) };
(( percent $format:literal $none:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
if let Some(percent) = s.percent() {
format!($format, $crate::internal::FormatFloat::new(percent, false))
} else {
$none.to_string()
}
}))
};
( pos ) => { $crate::item!(( pos "{}" )) };
( pos_group ) => { $crate::item!(( pos "{:#}" )) };
(( pos $format:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
format!(
$format,
$crate::internal::FormatInteger::new(s.pos(), s.thousands_separator())
)
}))
};
( pos_bin ) => { $crate::item!(( pos_bin "{:#} {}" )) };
(( pos_bin $format:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
let (amount, prefix) = $crate::binary_prefix(s.pos() as f64);
format!(
$format,
$crate::internal::FormatFloat::new(amount, prefix == ""),
$crate::internal::FormatPrefix::new(prefix),
)
}))
};
( pos_dec ) => { $crate::item!(( pos_dec "{:#} {}" )) };
(( pos_dec $format:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
let (amount, prefix) = $crate::decimal_prefix(s.pos() as f64);
format!(
$format,
$crate::internal::FormatFloat::new(amount, prefix == ""),
$crate::internal::FormatPrefix::new(prefix),
)
}))
};
( speed ) => { $crate::item!(( speed "{:#}" "" )) };
(( speed $format:literal )) => { $crate::item!(( speed $format "" )) };
(( speed $format:literal $none:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
if let Some(speed) = s.speed() {
format!($format, $crate::internal::FormatFloat::new(speed, false))
} else {
$none.to_string()
}
}))
};
( speed_int ) => { $crate::item!(( speed_int "{}" "" )) };
( speed_group ) => { $crate::item!(( speed_int "{:#}" "" )) };
(( speed_int $format:literal )) => { $crate::item!(( speed_int $format "" )) };
(( speed_int $format:literal $none:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
if let Some(speed) = s.speed() {
format!(
$format,
$crate::internal::FormatInteger::new(
speed.round() as u64,
s.thousands_separator(),
),
)
} else {
$none.to_string()
}
}))
};
( speed_bin ) => { $crate::item!(( speed_bin "{:#} {}" "" )) };
(( speed_bin $format:literal )) => { $crate::item!(( speed_bin $format "" )) };
(( speed_bin $format:literal $none:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
if let Some(speed) = s.speed() {
let (amount, prefix) = $crate::binary_prefix(speed);
format!(
$format,
$crate::internal::FormatFloat::new(amount, false),
$crate::internal::FormatPrefix::new(prefix),
)
} else {
$none.to_string()
}
}))
};
( speed_dec ) => { $crate::item!(( speed_dec "{:#} {}" "" )) };
(( speed_dec $format:literal )) => { $crate::item!(( speed_dec $format "" )) };
(( speed_dec $format:literal $none:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
if let Some(speed) = s.speed() {
let (amount, prefix) = $crate::decimal_prefix(speed);
format!(
$format,
$crate::internal::FormatFloat::new(amount, false),
$crate::internal::FormatPrefix::new(prefix),
)
} else {
$none.to_string()
}
}))
};
( total ) => { $crate::item!(( total "{}" "" )) };
( total_group ) => { $crate::item!(( total "{:#}" "" )) };
(( total $format:literal )) => { $crate::item!(( total $format "" )) };
(( total $format:literal $none:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
if let Some(total) = s.total() {
format!(
$format,
$crate::internal::FormatInteger::new(total, s.thousands_separator())
)
} else {
$none.to_string()
}
}))
};
( total_bin ) => { $crate::item!(( total_bin "{:#} {}" "" )) };
(( total_bin $format:literal )) => { $crate::item!(( total_bin $format "" )) };
(( total_bin $format:literal $none:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
if let Some(total) = s.total() {
let (amount, prefix) = $crate::binary_prefix(total as f64);
format!(
$format,
$crate::internal::FormatFloat::new(amount, prefix == ""),
$crate::internal::FormatPrefix::new(prefix),
)
} else {
$none.to_string()
}
}))
};
( total_dec ) => { $crate::item!(( total_dec "{:#} {}" "" )) };
(( total_dec $format:literal )) => { $crate::item!(( total_dec $format "" )) };
(( total_dec $format:literal $none:literal )) => {
$crate::internal::Item::Fn(Box::new(|s| {
if let Some(total) = s.total() {
let (amount, prefix) = $crate::decimal_prefix(total as f64);
format!(
$format,
$crate::internal::FormatFloat::new(amount, prefix == ""),
$crate::internal::FormatPrefix::new(prefix),
)
} else {
$none.to_string()
}
}))
};
(( $expr:expr )) => {
$crate::internal::Item::Fn(Box::new($expr))
};
( $literal:literal ) => {
$crate::internal::Item::Literal(format!("{}", $literal))
};
}