phink_lib/contract/selectors/
database.rs1use 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}