Skip to main content

plexus_engine/capabilities/
wire.rs

1use plexus_serde::{CapabilityOrderingContract as WireOrderingContract, Version};
2use serde::{Deserialize, Serialize};
3
4use crate::capabilities::ordering::OpOrderingContract;
5use crate::capabilities::types::{CapabilityError, PlanSemver, VersionRange};
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8pub struct EngineCapabilityDocument {
9    pub version_range: VersionRange,
10    pub supported_ops: Vec<String>,
11    pub supported_exprs: Vec<String>,
12    #[serde(default)]
13    pub op_ordering_contracts: Vec<OpOrderingDocument>,
14    #[serde(default)]
15    pub supports_graph_ref: bool,
16    #[serde(default)]
17    pub supports_multi_graph: bool,
18    #[serde(default)]
19    pub supports_graph_params: bool,
20}
21
22#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
23pub struct OpOrderingDocument {
24    pub op: String,
25    pub contract: OpOrderingContract,
26}
27
28pub(crate) fn to_wire_ordering_contract(contract: OpOrderingContract) -> WireOrderingContract {
29    match contract {
30        OpOrderingContract::EngineDefinedStable => WireOrderingContract::EngineDefinedStable,
31        OpOrderingContract::StablePassThrough => WireOrderingContract::StablePassThrough,
32        OpOrderingContract::FanOutDeterministicPerInput => {
33            WireOrderingContract::FanOutDeterministicPerInput
34        }
35        OpOrderingContract::DeterministicSortStableTies => {
36            WireOrderingContract::DeterministicSortStableTies
37        }
38        OpOrderingContract::UnspecifiedWithoutSort => WireOrderingContract::UnspecifiedWithoutSort,
39        OpOrderingContract::StableConcatOrUnspecifiedDistinct => {
40            WireOrderingContract::StableConcatOrUnspecifiedDistinct
41        }
42        OpOrderingContract::ScoreDescStableTies => WireOrderingContract::ScoreDescStableTies,
43    }
44}
45
46pub(crate) fn from_wire_ordering_contract(contract: WireOrderingContract) -> OpOrderingContract {
47    match contract {
48        WireOrderingContract::EngineDefinedStable => OpOrderingContract::EngineDefinedStable,
49        WireOrderingContract::StablePassThrough => OpOrderingContract::StablePassThrough,
50        WireOrderingContract::FanOutDeterministicPerInput => {
51            OpOrderingContract::FanOutDeterministicPerInput
52        }
53        WireOrderingContract::DeterministicSortStableTies => {
54            OpOrderingContract::DeterministicSortStableTies
55        }
56        WireOrderingContract::UnspecifiedWithoutSort => OpOrderingContract::UnspecifiedWithoutSort,
57        WireOrderingContract::StableConcatOrUnspecifiedDistinct => {
58            OpOrderingContract::StableConcatOrUnspecifiedDistinct
59        }
60        WireOrderingContract::ScoreDescStableTies => OpOrderingContract::ScoreDescStableTies,
61    }
62}
63
64pub fn check_version_compat(version: &Version, range: VersionRange) -> Result<(), CapabilityError> {
65    let pv = PlanSemver::from(version);
66    if range.supports(pv) {
67        return Ok(());
68    }
69    Err(CapabilityError::UnsupportedPlanVersion {
70        plan_major: pv.major,
71        plan_minor: pv.minor,
72        plan_patch: pv.patch,
73        min_major: range.min_supported.major,
74        min_minor: range.min_supported.minor,
75        min_patch: range.min_supported.patch,
76        max_major: range.max_supported.major,
77        max_minor: range.max_supported.minor,
78        max_patch: range.max_supported.patch,
79    })
80}