use crate::{
ElicitCommunicator, ElicitIntrospect, ElicitResult, Elicitation, ElicitationPattern,
PatternDetails, Prompt, TypeMetadata,
};
macro_rules! impl_integer_elicit_via_wrapper {
($primitive:ty, $wrapper:ident, $style:ident) => {
crate::default_style!($primitive => $style);
impl Prompt for $primitive {
fn prompt() -> Option<&'static str> {
Some(concat!(
"Please enter a ",
stringify!($primitive),
" (between ",
stringify!(<$primitive>::MIN),
" and ",
stringify!(<$primitive>::MAX),
"):"
))
}
}
impl Elicitation for $primitive {
type Style = $style;
#[tracing::instrument(skip(communicator), fields(type_name = stringify!($primitive)))]
async fn elicit<C: ElicitCommunicator>(communicator: &C) -> ElicitResult<Self> {
use crate::verification::types::$wrapper;
tracing::debug!(concat!("Eliciting ", stringify!($primitive), " via ", stringify!($wrapper), " wrapper"));
let wrapper = $wrapper::elicit(communicator).await?;
Ok(wrapper.into_inner())
}
}
impl ElicitIntrospect for $primitive {
fn pattern() -> ElicitationPattern {
ElicitationPattern::Primitive
}
fn metadata() -> TypeMetadata {
TypeMetadata {
type_name: stringify!($primitive),
description: <Self as Prompt>::prompt(),
details: PatternDetails::Primitive,
}
}
}
};
}
impl_integer_elicit_via_wrapper!(i8, I8Default, I8Style);
impl_integer_elicit_via_wrapper!(i16, I16Default, I16Style);
impl_integer_elicit_via_wrapper!(i32, I32Default, I32Style);
impl_integer_elicit_via_wrapper!(i128, I128Default, I128Style);
impl_integer_elicit_via_wrapper!(isize, IsizeDefault, IsizeStyle);
crate::default_style!(i64 => I64Style);
impl Prompt for i64 {
fn prompt() -> Option<&'static str> {
Some("Please enter a i64 (between -9223372036854775808 and 9223372036854775807):")
}
}
impl Elicitation for i64 {
type Style = I64Style;
#[tracing::instrument(skip(communicator), fields(type_name = "i64"))]
async fn elicit<C: ElicitCommunicator>(communicator: &C) -> ElicitResult<Self> {
use crate::verification::types::I64Default;
tracing::debug!("Eliciting i64 via I64Default wrapper");
let wrapper = I64Default::elicit(communicator).await?;
Ok(wrapper.into_inner())
}
}
impl ElicitIntrospect for i64 {
fn pattern() -> ElicitationPattern {
ElicitationPattern::Primitive
}
fn metadata() -> TypeMetadata {
TypeMetadata {
type_name: "i64",
description: Self::prompt(),
details: PatternDetails::Primitive,
}
}
}
impl_integer_elicit_via_wrapper!(u8, U8Default, U8Style);
impl_integer_elicit_via_wrapper!(u16, U16Default, U16Style);
impl_integer_elicit_via_wrapper!(u32, U32Default, U32Style);
impl_integer_elicit_via_wrapper!(u64, U64Default, U64Style);
impl_integer_elicit_via_wrapper!(u128, U128Default, U128Style);
impl_integer_elicit_via_wrapper!(usize, UsizeDefault, UsizeStyle);