use ui::{backend::Backend, widgets::Text};
use super::Select;
use crate::{
question::{Choice, Options},
ListItem,
};
#[derive(Debug)]
pub struct SelectBuilder<'a> {
opts: Options<'a>,
select: Select<'a>,
}
impl<'a> SelectBuilder<'a> {
pub(crate) fn new(name: String) -> Self {
SelectBuilder {
opts: Options::new(name),
select: Default::default(),
}
}
crate::impl_options_builder! {
message
when
ask_if_answered
on_esc
}
pub fn default(mut self, default: usize) -> Self {
self.select.choices.set_default(default);
self
}
pub fn page_size(mut self, page_size: usize) -> Self {
assert!(page_size >= 5, "page size can be a minimum of 5");
self.select.choices.set_page_size(page_size);
self
}
pub fn should_loop(mut self, should_loop: bool) -> Self {
self.select.choices.set_should_loop(should_loop);
self
}
pub fn choice<I: Into<String>>(mut self, text: I) -> Self {
self.select
.choices
.choices
.push(Choice::Choice(Text::new(text.into())));
self
}
pub fn separator<I: Into<String>>(mut self, text: I) -> Self {
self.select
.choices
.choices
.push(Choice::Separator(text.into()));
self
}
pub fn default_separator(mut self) -> Self {
self.select.choices.choices.push(Choice::DefaultSeparator);
self
}
pub fn choices<I, T>(mut self, choices: I) -> Self
where
T: Into<Choice<String>>,
I: IntoIterator<Item = T>,
{
self.select.choices.choices.extend(
choices
.into_iter()
.map(|choice| choice.into().map(Text::new)),
);
self
}
crate::impl_transform_builder! {
ListItem; select
}
pub fn build(self) -> crate::question::Question<'a> {
if let Some(default) = self.select.choices.default() {
if self.select.choices[default].is_separator() {
panic!("Invalid default '{}' is not a `Choice`", default);
}
}
crate::question::Question::new(
self.opts,
crate::question::QuestionKind::Select(self.select),
)
}
}
impl<'a> From<SelectBuilder<'a>> for crate::question::Question<'a> {
fn from(builder: SelectBuilder<'a>) -> Self {
builder.build()
}
}