lets_expect_core/expectations/
be_ok_and.rs

1use std::collections::HashSet;
2
3use proc_macro2::{Ident, Span};
4use quote::quote_spanned;
5use syn::parse::{Parse, ParseStream};
6
7use crate::core::keyword;
8
9use super::{
10    expectation_tokens::{AssertionTokens, ExpectationTokens, GroupAssertionTokens},
11    expectation_type::ExpectationType,
12    inner::InnerExpectation,
13};
14
15pub struct BeOkAndExpectation {
16    expectation: Box<InnerExpectation>,
17    identifier_string: String,
18}
19
20impl BeOkAndExpectation {
21    pub(crate) fn new(expectation: InnerExpectation) -> Self {
22        let identifier_string = format!("be_ok_and_{}", expectation.identifier_string());
23
24        Self {
25            expectation: Box::new(expectation),
26            identifier_string,
27        }
28    }
29
30    pub fn peek(input: &syn::parse::ParseStream) -> bool {
31        input.peek(keyword::be_ok_and)
32    }
33
34    pub fn span(&self) -> Span {
35        self.expectation.span()
36    }
37
38    pub fn identifier_string(&self) -> &str {
39        &self.identifier_string
40    }
41
42    pub fn dependencies(&self) -> HashSet<Ident> {
43        self.expectation.dependencies()
44    }
45
46    pub(crate) fn tokens(&self, ident_prefix: &str) -> ExpectationTokens {
47        let inner_tokens = self.expectation.tokens(ident_prefix, false, false);
48        let before_subject = inner_tokens.before_subject_evaluation;
49
50        let guard = quote_spanned! { self.span() => let Ok(subject) = subject };
51
52        let assertions = AssertionTokens::Group(GroupAssertionTokens::new(
53            "be_ok_and".to_string(),
54            "".to_string(),
55            Some(guard),
56            None,
57            inner_tokens.assertions,
58        ));
59
60        ExpectationTokens {
61            before_subject_evaluation: before_subject,
62            assertions,
63        }
64    }
65}
66
67impl Parse for BeOkAndExpectation {
68    fn parse(input: ParseStream) -> syn::Result<Self> {
69        input.parse::<keyword::be_ok_and>()?;
70
71        let inner = input.parse::<InnerExpectation>()?;
72
73        Ok(Self::new(inner))
74    }
75}