Skip to main content

elicitation/collections/
vecdeque.rs

1//! VecDeque<T> implementation for double-ended queue elicitation.
2
3use crate::{ElicitClient, ElicitResult, Elicitation, Prompt};
4use std::collections::VecDeque;
5
6// Default-only style for VecDeque
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
8pub enum VecDequeStyle {
9    #[default]
10    Default,
11}
12
13impl Prompt for VecDequeStyle {
14    fn prompt() -> Option<&'static str> {
15        None
16    }
17}
18
19impl Elicitation for VecDequeStyle {
20    type Style = VecDequeStyle;
21
22    #[tracing::instrument(skip(_client), level = "trace")]
23    async fn elicit(_client: &ElicitClient<'_>) -> ElicitResult<Self> {
24        Ok(Self::Default)
25    }
26}
27
28impl<T> Prompt for VecDeque<T>
29where
30    T: Elicitation + Send,
31{
32    fn prompt() -> Option<&'static str> {
33        Some("Would you like to add items to this deque?")
34    }
35}
36
37impl<T> Elicitation for VecDeque<T>
38where
39    T: Elicitation + Send,
40{
41    type Style = VecDequeStyle;
42
43    #[tracing::instrument(skip(client), fields(item_type = std::any::type_name::<T>()))]
44    async fn elicit(client: &ElicitClient<'_>) -> ElicitResult<Self> {
45        let mut deque = VecDeque::new();
46        tracing::debug!("Eliciting VecDeque");
47
48        loop {
49            let add_more = if deque.is_empty() {
50                tracing::debug!("Prompting for first item");
51                bool::elicit(client).await?
52            } else {
53                tracing::debug!(count = deque.len(), "Prompting for additional item");
54                bool::elicit(client).await?
55            };
56
57            if !add_more {
58                tracing::debug!(final_count = deque.len(), "VecDeque complete");
59                break;
60            }
61
62            tracing::debug!("Eliciting item");
63            let item = T::elicit(client).await?;
64            deque.push_back(item);
65        }
66
67        Ok(deque)
68    }
69}