use ui::backend::Backend;
use ui::widgets::Text;
use crate::question::Options;
use super::{OrderSelect, OrderSelectItem};
#[derive(Debug)]
pub struct OrderSelectBuilder<'a> {
opts: Options<'a>,
order_select: OrderSelect<'a>,
}
impl<'a> OrderSelectBuilder<'a> {
pub(crate) fn new(name: String) -> Self {
Self {
opts: Options::new(name),
order_select: Default::default(),
}
}
crate::impl_options_builder! {
message
when
ask_if_answered
on_esc
}
pub fn page_size(mut self, page_size: usize) -> Self {
assert!(page_size >= 5, "page size can be a minimum of 5");
self.order_select.choices.set_page_size(page_size);
self
}
pub fn should_loop(mut self, should_loop: bool) -> Self {
self.order_select.choices.set_should_loop(should_loop);
self
}
pub fn choices<I, T>(mut self, choices: I) -> Self
where
T: Into<String>,
I: IntoIterator<Item = T>,
{
let len = self.order_select.choices.choices.len();
self.order_select
.choices
.choices
.extend(
choices
.into_iter()
.enumerate()
.map(|(i, c)| OrderSelectItem {
initial_index: len + i,
text: Text::new(c.into()),
}),
);
self
}
crate::impl_filter_builder! {
Vec<OrderSelectItem>; order_select
}
crate::impl_validate_builder! {
[OrderSelectItem]; order_select
}
crate::impl_transform_builder! {
[OrderSelectItem]; order_select
}
pub fn build(mut self) -> crate::question::Question<'a> {
self.order_select.max_index_width =
(self.order_select.choices.len() as f64 + 1.0).log10() as usize + 1;
crate::question::Question::new(
self.opts,
crate::question::QuestionKind::OrderSelect(self.order_select),
)
}
}
impl<'a> From<OrderSelectBuilder<'a>> for crate::question::Question<'a> {
fn from(builder: OrderSelectBuilder<'a>) -> Self {
builder.build()
}
}