fuel_core/database/
message.rs1use crate::{
2 database::{
3 OffChainIterableKeyValueView,
4 OnChainIterableKeyValueView,
5 },
6 fuel_core_graphql_api::storage::messages::{
7 OwnedMessageIds,
8 OwnedMessageKey,
9 SpentMessages,
10 },
11};
12use fuel_core_chain_config::TableEntry;
13use fuel_core_storage::{
14 Result as StorageResult,
15 iter::{
16 IterDirection,
17 IteratorOverTable,
18 },
19 tables::Messages,
20};
21use fuel_core_types::{
22 entities::relayer::message::Message,
23 fuel_types::{
24 Address,
25 Nonce,
26 },
27};
28use itertools::Itertools;
29
30impl OffChainIterableKeyValueView {
31 pub fn owned_message_ids(
32 &self,
33 owner: &Address,
34 start_message_id: Option<Nonce>,
35 direction: Option<IterDirection>,
36 ) -> impl Iterator<Item = StorageResult<Nonce>> + '_ + use<'_> {
37 let start_message_id =
38 start_message_id.map(|msg_id| OwnedMessageKey::new(owner, &msg_id));
39 self.iter_all_filtered_keys::<OwnedMessageIds, _>(
40 Some(*owner),
41 start_message_id.as_ref(),
42 direction,
43 )
44 .map(|res| res.map(|key| *key.nonce()))
45 }
46
47 pub fn message_is_spent(&self, id: &Nonce) -> StorageResult<bool> {
48 fuel_core_storage::StorageAsRef::storage::<SpentMessages>(&self).contains_key(id)
49 }
50}
51
52impl OnChainIterableKeyValueView {
53 pub fn all_messages(
54 &self,
55 start: Option<Nonce>,
56 direction: Option<IterDirection>,
57 ) -> impl Iterator<Item = StorageResult<Message>> + '_ {
58 self.iter_all_by_start::<Messages>(start.as_ref(), direction)
59 .map(|res| res.map(|(_, message)| message))
60 }
61
62 pub fn iter_messages(
63 &self,
64 ) -> impl Iterator<Item = StorageResult<TableEntry<Messages>>> + '_ {
65 self.iter_all_by_start::<Messages>(None, None)
66 .map_ok(|(key, value)| TableEntry { key, value })
67 }
68
69 pub fn message_exists(&self, id: &Nonce) -> StorageResult<bool> {
70 fuel_core_storage::StorageAsRef::storage::<Messages>(&self).contains_key(id)
71 }
72}