use crate::{ElicitCommunicator, ElicitResult, Elicitation, Prompt};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum ArrayStyle {
#[default]
Default,
}
impl Prompt for ArrayStyle {
fn prompt() -> Option<&'static str> {
None
}
}
impl Elicitation for ArrayStyle {
type Style = ArrayStyle;
#[tracing::instrument(skip(_communicator), level = "trace")]
async fn elicit<C: ElicitCommunicator>(_communicator: &C) -> ElicitResult<Self> {
Ok(Self::Default)
}
}
impl<T, const N: usize> Prompt for [T; N]
where
T: Elicitation + Send,
{
fn prompt() -> Option<&'static str> {
Some("Eliciting fixed-size array elements:")
}
}
impl<T, const N: usize> Elicitation for [T; N]
where
T: Elicitation + Send,
{
type Style = ArrayStyle;
#[tracing::instrument(skip(communicator), fields(
item_type = std::any::type_name::<T>(),
size = N
))]
async fn elicit<C: ElicitCommunicator>(communicator: &C) -> ElicitResult<Self> {
tracing::debug!(size = N, "Eliciting fixed-size array");
let mut items = Vec::with_capacity(N);
for i in 0..N {
tracing::debug!(index = i, total = N, "Eliciting array element");
let item = T::elicit(communicator).await?;
items.push(item);
}
items.try_into().map_err(|_| {
crate::ElicitError::new(crate::ElicitErrorKind::InvalidFormat {
expected: format!("array of size {}", N),
received: "incorrect size".to_string(),
})
})
}
}