Skip to main content

coil_runtime/builder/
customer_plugins.rs

1use coil_customer_sdk::{
2    BackendError, CheckoutHooks, CmsHooks, VerifiedWebhookAssetHooks, VerifiedWebhookHooks,
3};
4use std::fmt;
5use std::sync::Arc;
6
7pub use coil_customer_sdk::{CustomerBackendPlugin, CustomerHookRegistry, RegisteredHookKind};
8
9#[derive(Clone, Default)]
10pub(crate) struct CustomerHookSet {
11    pub(crate) checkout: Vec<Arc<dyn CheckoutHooks>>,
12    pub(crate) cms: Vec<Arc<dyn CmsHooks>>,
13    pub(crate) verified_webhooks: Vec<Arc<dyn VerifiedWebhookHooks>>,
14    pub(crate) verified_webhook_assets: Vec<Arc<dyn VerifiedWebhookAssetHooks>>,
15}
16
17impl fmt::Debug for CustomerHookSet {
18    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19        f.debug_struct("CustomerHookSet")
20            .field("checkout", &self.checkout.len())
21            .field("cms", &self.cms.len())
22            .field("verified_webhooks", &self.verified_webhooks.len())
23            .field(
24                "verified_webhook_assets",
25                &self.verified_webhook_assets.len(),
26            )
27            .finish()
28    }
29}
30
31#[derive(Debug, Clone, PartialEq, Eq)]
32pub struct LinkedCustomerPluginSummary {
33    pub plugin_id: String,
34    pub display_name: String,
35    pub version: String,
36    pub registered_hooks: Vec<RegisteredHookKind>,
37}
38
39#[derive(Default)]
40pub(crate) struct RuntimeCustomerHookRegistry {
41    hooks: CustomerHookSet,
42    registered_hooks: Vec<RegisteredHookKind>,
43}
44
45impl RuntimeCustomerHookRegistry {
46    pub(crate) fn into_parts(self) -> (CustomerHookSet, Vec<RegisteredHookKind>) {
47        (self.hooks, self.registered_hooks)
48    }
49}
50
51impl CustomerHookRegistry for RuntimeCustomerHookRegistry {
52    fn register_checkout_hooks(
53        &mut self,
54        hooks: Arc<dyn CheckoutHooks>,
55    ) -> Result<(), BackendError> {
56        self.hooks.checkout.push(hooks);
57        self.registered_hooks.push(RegisteredHookKind::Checkout);
58        Ok(())
59    }
60
61    fn register_cms_hooks(&mut self, hooks: Arc<dyn CmsHooks>) -> Result<(), BackendError> {
62        self.hooks.cms.push(hooks);
63        self.registered_hooks
64            .push(RegisteredHookKind::CmsPagePublish);
65        Ok(())
66    }
67
68    fn register_verified_webhook_hooks(
69        &mut self,
70        hooks: Arc<dyn VerifiedWebhookHooks>,
71    ) -> Result<(), BackendError> {
72        self.hooks.verified_webhooks.push(hooks);
73        self.registered_hooks
74            .push(RegisteredHookKind::VerifiedWebhook);
75        Ok(())
76    }
77
78    fn register_verified_webhook_asset_hooks(
79        &mut self,
80        hooks: Arc<dyn VerifiedWebhookAssetHooks>,
81    ) -> Result<(), BackendError> {
82        self.hooks.verified_webhook_assets.push(hooks);
83        self.registered_hooks
84            .push(RegisteredHookKind::VerifiedWebhookAssets);
85        Ok(())
86    }
87}