phink_lib/contract/selectors/
database.rs

1use crate::{
2    contract::selectors::selector::Selector,
3    ResultOf,
4};
5use anyhow::bail;
6
7#[derive(Clone, Debug)]
8pub struct SelectorDatabase {
9    invariants: Vec<Selector>,
10    messages: Vec<Selector>,
11    payable_messages: Vec<Selector>,
12}
13
14impl Default for SelectorDatabase {
15    fn default() -> Self {
16        Self::new()
17    }
18}
19
20impl SelectorDatabase {
21    pub fn new() -> Self {
22        Self {
23            invariants: Vec::default(),
24            messages: Vec::default(),
25            payable_messages: Vec::default(),
26        }
27    }
28
29    pub fn contains_invariant(&self, selector: &Selector) -> bool {
30        self.invariants.contains(selector)
31    }
32
33    pub fn contains_message(&self, selector: &Selector) -> bool {
34        self.messages.contains(selector)
35    }
36
37    pub fn is_payable(&self, selector: &Selector) -> bool {
38        self.payable_messages.contains(selector)
39    }
40    pub fn add_payables(&mut self, selectors: Vec<Selector>) {
41        self.payable_messages.extend(selectors);
42    }
43    pub fn exists(&self, selector: Selector) -> bool {
44        self.messages.contains(&selector) || self.invariants.contains(&selector)
45    }
46
47    pub fn add_invariants(&mut self, invariants: Vec<Selector>) {
48        self.invariants.extend(invariants);
49    }
50
51    pub fn add_messages(&mut self, messages: Vec<Selector>) {
52        self.messages.extend(messages);
53    }
54
55    pub fn get_unique_messages(self) -> ResultOf<Vec<Selector>> {
56        if !self.messages.is_empty() && !self.invariants.is_empty() {
57            return Ok(self
58                .messages
59                .into_iter()
60                .filter(|msg| !self.invariants.contains(msg))
61                .collect());
62        }
63        bail!("No unique messages were found in the database. Check if the contract has some ink! messages *and* at least one invariant")
64    }
65
66    pub fn invariants(self) -> ResultOf<Vec<Selector>> {
67        if !self.invariants.is_empty() {
68            return Ok(self.invariants)
69        }
70        bail!("No invariants were found in the database. Check if the contract has at least one invariant")
71    }
72
73    pub fn messages(self) -> ResultOf<Vec<Selector>> {
74        if !self.messages.is_empty() {
75            return Ok(self.messages)
76        }
77        bail!("No messages were found in the database. Check if the contract has at least one message")
78    }
79}