lets_expect_core/expectations/
be_ok_and.rs1use 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}