tenferro_runtime/runtime/
extension_provider.rs1use std::any::Any;
2use std::fmt;
3use std::hash::Hasher;
4
5use tenferro_ops::ext_op::ExtensionOp;
6
7use super::{
8 ExecutionContextIdentity, HardwareClassId, InputSignature, PrepareCapability, PrepareError,
9 PrepareOptionsKey, PreparedOperationBinding, ResolvedPlanningConfig, ResolvedProgramPlacement,
10 SpecializationProjection,
11};
12
13pub trait ExtensionPlanningConfig: Any + fmt::Debug + Send + Sync + 'static {
18 fn family_id(&self) -> &'static str;
20 fn as_any(&self) -> &dyn Any;
22 fn payload_hash(&self, state: &mut dyn Hasher);
24 fn payload_eq(&self, other: &dyn ExtensionPlanningConfig) -> bool;
26 fn retained_bytes(&self) -> usize;
28}
29
30pub struct ExtensionPrepareRequest<'a> {
32 operation: &'a dyn ExtensionOp,
33 binding: &'a PreparedOperationBinding,
34 resolved_placement: &'a ResolvedProgramPlacement,
35 hardware_class: &'a HardwareClassId,
36 planning: &'a ResolvedPlanningConfig,
37 extension_config: &'a dyn ExtensionPlanningConfig,
38 inputs: &'a InputSignature,
39 prepare_options_key: &'a PrepareOptionsKey,
40 specialization: &'a SpecializationProjection,
41}
42
43impl<'a> ExtensionPrepareRequest<'a> {
44 #[allow(dead_code)]
45 #[allow(clippy::too_many_arguments)]
46 pub(crate) fn new(
47 operation: &'a dyn ExtensionOp,
48 binding: &'a PreparedOperationBinding,
49 resolved_placement: &'a ResolvedProgramPlacement,
50 hardware_class: &'a HardwareClassId,
51 planning: &'a ResolvedPlanningConfig,
52 extension_config: &'a dyn ExtensionPlanningConfig,
53 inputs: &'a InputSignature,
54 prepare_options_key: &'a PrepareOptionsKey,
55 specialization: &'a SpecializationProjection,
56 ) -> Self {
57 Self {
58 operation,
59 binding,
60 resolved_placement,
61 hardware_class,
62 planning,
63 extension_config,
64 inputs,
65 prepare_options_key,
66 specialization,
67 }
68 }
69
70 pub fn operation(&self) -> &'a dyn ExtensionOp {
72 self.operation
73 }
74
75 pub fn binding(&self) -> &'a PreparedOperationBinding {
77 self.binding
78 }
79
80 pub fn resolved_placement(&self) -> &'a ResolvedProgramPlacement {
82 self.resolved_placement
83 }
84
85 pub fn hardware_class(&self) -> &'a HardwareClassId {
87 self.hardware_class
88 }
89
90 pub fn planning(&self) -> &'a ResolvedPlanningConfig {
92 self.planning
93 }
94
95 pub fn extension_config(&self) -> &'a dyn ExtensionPlanningConfig {
97 self.extension_config
98 }
99
100 pub fn inputs(&self) -> &'a InputSignature {
102 self.inputs
103 }
104
105 pub fn prepare_options_key(&self) -> &'a PrepareOptionsKey {
107 self.prepare_options_key
108 }
109
110 pub fn specialization(&self) -> &'a SpecializationProjection {
112 self.specialization
113 }
114}
115
116impl fmt::Debug for ExtensionPrepareRequest<'_> {
117 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
118 formatter
119 .debug_struct("ExtensionPrepareRequest")
120 .field("operation", &self.operation.family_id())
121 .field("binding", self.binding)
122 .field("resolved_placement", self.resolved_placement)
123 .field("hardware_class", self.hardware_class)
124 .field("planning", self.planning)
125 .field("extension_config", &self.extension_config.family_id())
126 .field("inputs", &self.inputs.entries().len())
127 .field("prepare_options_key", self.prepare_options_key)
128 .field("specialization", self.specialization)
129 .finish()
130 }
131}
132
133pub trait ExtensionEngine: fmt::Debug + Send + Sync + 'static {
135 fn family_id(&self) -> &'static str;
137 fn engine_id(&self) -> &super::EngineId;
139 fn context_identity(&self) -> ExecutionContextIdentity;
141 fn prepare(
147 &self,
148 request: ExtensionPrepareRequest<'_>,
149 ) -> Result<PrepareCapability, PrepareError>;
150}