elicitation/collections/
vecdeque.rs1use crate::{ElicitClient, ElicitResult, Elicitation, Prompt};
4use std::collections::VecDeque;
5
6#[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}