pub use crate::events_handler::{
EventCallbackError, EventError, EventHandlerRegistrationError, EventHandlingError,
EventsHandler, IntoEventHandlerResult, SIGNATURE_HEADER, SIGNATURE_VERSION, verify_signature,
};
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub(crate) struct RawEvent {
id: String,
#[serde(rename = "type")]
event_type: String,
created_at: crate::datetime::DateTime,
object: EventObject,
}
impl RawEvent {
pub(crate) fn event_type(&self) -> &str {
&self.event_type
}
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct EventObject {
pub id: String,
#[serde(rename = "type")]
pub object_type: String,
pub url: String,
}
pub trait FetchObject {
type Object;
fn fetch_object(
&self,
) -> impl std::future::Future<Output = crate::error::SdkResult<Self::Object>> + '_;
}
pub(crate) mod private {
pub trait Sealed {}
}
pub trait EventSpec: private::Sealed {
const EVENT_TYPE: &'static str;
type FetchedObject: serde::de::DeserializeOwned;
}
#[derive(Debug, Clone)]
pub struct Event<E: EventSpec> {
pub id: String,
pub created_at: crate::datetime::DateTime,
pub object: EventObject,
client: crate::Client,
spec: std::marker::PhantomData<E>,
}
impl<E: EventSpec> Event<E> {
pub(crate) fn from_raw(client: crate::Client, event: RawEvent) -> Self {
Self {
id: event.id,
created_at: event.created_at,
object: event.object,
client,
spec: std::marker::PhantomData,
}
}
pub fn event_type(&self) -> &'static str {
E::EVENT_TYPE
}
}
impl<E: EventSpec> FetchObject for Event<E> {
type Object = E::FetchedObject;
fn fetch_object(
&self,
) -> impl std::future::Future<Output = crate::error::SdkResult<Self::Object>> + '_ {
crate::events_handler::fetch_object(&self.client, &self.object.url)
}
}
#[derive(Debug, Clone)]
pub struct UnknownEvent {
pub id: String,
pub event_type: String,
pub created_at: crate::datetime::DateTime,
pub object: EventObject,
client: crate::Client,
}
impl UnknownEvent {
pub(crate) fn from_raw(client: crate::Client, event: RawEvent) -> Self {
Self {
id: event.id,
event_type: event.event_type,
created_at: event.created_at,
object: event.object,
client,
}
}
}
impl FetchObject for UnknownEvent {
type Object = serde_json::Value;
fn fetch_object(
&self,
) -> impl std::future::Future<Output = crate::error::SdkResult<Self::Object>> + '_ {
crate::events_handler::fetch_object(&self.client, &self.object.url)
}
}