essential_types/
predicate.rs1use crate::{serde::bytecode, ContentAddress};
5pub use encode::{PredicateDecodeError, PredicateEncodeError};
6use serde::{Deserialize, Serialize};
7
8#[cfg(feature = "schema")]
9use schemars::JsonSchema;
10
11pub mod encode;
12
13#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
15#[cfg_attr(feature = "schema", derive(JsonSchema))]
16pub struct Node {
17 pub edge_start: Edge,
21 pub program_address: ContentAddress,
23}
24
25pub type Edge = u16;
27
28#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
30#[cfg_attr(feature = "schema", derive(JsonSchema))]
31pub struct Predicate {
32 pub nodes: Vec<Node>,
34 pub edges: Vec<Edge>,
39}
40
41#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
43pub struct Program(
44 #[serde(
45 serialize_with = "bytecode::serialize",
46 deserialize_with = "bytecode::deserialize"
47 )]
48 pub Vec<u8>,
49);
50
51impl Predicate {
52 pub const MAX_NODES: u16 = 1000;
54 pub const MAX_EDGES: u16 = 1000;
56
57 pub fn encode(&self) -> Result<impl Iterator<Item = u8> + '_, PredicateEncodeError> {
59 encode::encode_predicate(self)
60 }
61
62 pub fn encoded_size(&self) -> usize {
64 encode::predicate_encoded_size(self)
65 }
66
67 pub fn decode(bytes: &[u8]) -> Result<Self, PredicateDecodeError> {
69 encode::decode_predicate(bytes)
70 }
71
72 pub fn node_edges(&self, node_ix: usize) -> Option<&[Edge]> {
79 let node = self.nodes.get(node_ix)?;
80 if node.edge_start == Edge::MAX {
81 return Some(&[]);
82 }
83 let e_start = usize::from(node.edge_start);
84 let next_node_ix = node_ix.saturating_add(1);
85 let e_end = match self.nodes.get(next_node_ix) {
86 Some(next) if next.edge_start != Edge::MAX => usize::from(next.edge_start),
88 Some(_) | None => self.edges.len(),
90 };
91 let edges = self.edges.get(e_start..e_end)?;
92 Some(edges)
93 }
94}
95
96impl Program {
97 pub const MAX_SIZE: u16 = 10_000;
99}