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(
15 Debug, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
16)]
17#[repr(u8)]
18#[cfg_attr(feature = "schema", derive(JsonSchema))]
19pub enum Reads {
20 #[default]
22 Pre = 0,
23 Post,
25}
26
27#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
29#[cfg_attr(feature = "schema", derive(JsonSchema))]
30pub struct Node {
31 pub edge_start: Edge,
35 pub program_address: ContentAddress,
37 pub reads: Reads,
39}
40
41pub type Edge = u16;
43
44#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
46#[cfg_attr(feature = "schema", derive(JsonSchema))]
47pub struct Predicate {
48 pub nodes: Vec<Node>,
50 pub edges: Vec<Edge>,
55}
56
57#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
59pub struct Program(
60 #[serde(
61 serialize_with = "bytecode::serialize",
62 deserialize_with = "bytecode::deserialize"
63 )]
64 pub Vec<u8>,
65);
66
67impl Predicate {
68 pub const MAX_NODES: u16 = 1000;
70 pub const MAX_EDGES: u16 = 1000;
72
73 pub fn encode(&self) -> Result<impl Iterator<Item = u8> + '_, PredicateEncodeError> {
75 encode::encode_predicate(self)
76 }
77
78 pub fn encoded_size(&self) -> usize {
80 encode::predicate_encoded_size(self)
81 }
82
83 pub fn decode(bytes: &[u8]) -> Result<Self, PredicateDecodeError> {
85 encode::decode_predicate(bytes)
86 }
87
88 pub fn node_edges(&self, node_ix: usize) -> Option<&[Edge]> {
95 let node = self.nodes.get(node_ix)?;
96 if node.edge_start == Edge::MAX {
97 return Some(&[]);
98 }
99 let e_start = usize::from(node.edge_start);
100 let next_node_ix = node_ix.saturating_add(1);
101 let e_end = match self.nodes.get(next_node_ix) {
102 Some(next) if next.edge_start != Edge::MAX => usize::from(next.edge_start),
104 Some(_) | None => self.edges.len(),
106 };
107 let edges = self.edges.get(e_start..e_end)?;
108 Some(edges)
109 }
110}
111
112impl Program {
113 pub const MAX_SIZE: u16 = 10_000;
115}