plexus_engine/capabilities/
wire.rs1use 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}