hypersync_net_types/
lib.rs

1//! Hypersync network types for transport and queries.
2//!
3//! This library provides types and serialization capabilities for interacting with hypersync servers.
4//! It supports both JSON and Cap'n Proto serialization formats for efficient network communication.
5
6// Module declarations
7pub mod block;
8pub mod log;
9pub mod query;
10pub mod response;
11pub mod trace;
12pub mod transaction;
13pub mod types;
14
15// Cap'n Proto generated code
16mod __generated__;
17pub use __generated__::hypersync_net_types_capnp;
18
19// Re-export types from modules for backward compatibility and convenience
20pub use block::{BlockFilter, BlockSelection};
21pub use log::{LogFilter, LogSelection};
22pub use query::{FieldSelection, JoinMode, Query};
23pub use response::{ArchiveHeight, ChainId, RollbackGuard};
24pub use trace::{TraceFilter, TraceSelection};
25pub use transaction::{AuthorizationSelection, TransactionFilter, TransactionSelection};
26pub use types::Sighash;
27
28use serde::{Deserialize, Serialize};
29
30#[derive(Default, Serialize, Deserialize, Clone, Debug, PartialEq)]
31pub struct Selection<T> {
32    /// Filters where matching values should be included in the response
33    /// Default::default() means include everything
34    #[serde(default, flatten)]
35    pub include: T,
36    /// Filters where matching values should be excluded from the response
37    /// None means exclude nothing, Some(Default::default()) means exclude everything
38    #[serde(default, skip_serializing_if = "Option::is_none")]
39    pub exclude: Option<T>,
40}
41
42impl<T> From<T> for Selection<T> {
43    fn from(include: T) -> Self {
44        Self {
45            include,
46            exclude: None,
47        }
48    }
49}
50
51pub(crate) trait BuilderReader<O: capnp::traits::Owned, E = capnp::Error> {
52    fn populate_builder<'a>(&self, builder: &mut O::Builder<'a>) -> Result<(), E>;
53
54    fn from_reader<'a>(reader: O::Reader<'a>) -> Result<Self, E>
55    where
56        Self: Sized;
57}
58
59impl<O, T> BuilderReader<hypersync_net_types_capnp::selection::Owned<O>> for Selection<T>
60where
61    O: capnp::traits::Owned,
62    T: BuilderReader<O, capnp::Error>,
63{
64    fn populate_builder<'a>(
65        &self,
66        builder: &mut hypersync_net_types_capnp::selection::Builder<'a, O>,
67    ) -> Result<(), capnp::Error> {
68        {
69            let mut include_builder = builder.reborrow().init_include();
70            self.include.populate_builder(&mut include_builder)?;
71        } // include borrow ends
72
73        if let Some(exclude) = &self.exclude {
74            let mut exclude_builder = builder.reborrow().init_exclude();
75            exclude.populate_builder(&mut exclude_builder)?;
76        } // exclude borrow ends
77
78        Ok(())
79    }
80
81    fn from_reader<'a>(
82        reader: hypersync_net_types_capnp::selection::Reader<'a, O>,
83    ) -> Result<Self, capnp::Error> {
84        let include = T::from_reader(reader.get_include()?)?;
85        let exclude = if reader.has_exclude() {
86            Some(T::from_reader(reader.get_exclude()?)?)
87        } else {
88            None
89        };
90        Ok(Self { include, exclude })
91    }
92}