use crate::{
ElicitCommunicator, ElicitIntrospect, ElicitResult, Elicitation, ElicitationPattern,
PatternDetails, Prompt, TypeMetadata,
};
macro_rules! impl_float_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), " number:"))
}
}
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())
}
fn kani_proof() -> proc_macro2::TokenStream {
use crate::verification::types::$wrapper;
<$wrapper as crate::Elicitation>::kani_proof()
}
fn verus_proof() -> proc_macro2::TokenStream {
use crate::verification::types::$wrapper;
<$wrapper as crate::Elicitation>::verus_proof()
}
fn creusot_proof() -> proc_macro2::TokenStream {
use crate::verification::types::$wrapper;
<$wrapper as crate::Elicitation>::creusot_proof()
}
}
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_float_elicit_via_wrapper!(f32, F32Default, F32Style);
crate::default_style!(f64 => F64Style);
impl Prompt for f64 {
fn prompt() -> Option<&'static str> {
Some("Please enter a number:")
}
}
impl Elicitation for f64 {
type Style = F64Style;
#[tracing::instrument(skip(communicator), fields(type_name = "f64"))]
async fn elicit<C: ElicitCommunicator>(communicator: &C) -> ElicitResult<Self> {
use crate::verification::types::F64Default;
tracing::debug!("Eliciting f64 via F64Default wrapper");
let wrapper = F64Default::elicit(communicator).await?;
Ok(wrapper.into_inner())
}
fn kani_proof() -> proc_macro2::TokenStream {
use crate::verification::types::F64Default;
<F64Default as crate::Elicitation>::kani_proof()
}
fn verus_proof() -> proc_macro2::TokenStream {
use crate::verification::types::F64Default;
<F64Default as crate::Elicitation>::verus_proof()
}
fn creusot_proof() -> proc_macro2::TokenStream {
use crate::verification::types::F64Default;
<F64Default as crate::Elicitation>::creusot_proof()
}
}
impl ElicitIntrospect for f64 {
fn pattern() -> ElicitationPattern {
ElicitationPattern::Primitive
}
fn metadata() -> TypeMetadata {
TypeMetadata {
type_name: "f64",
description: Self::prompt(),
details: PatternDetails::Primitive,
}
}
}