use async_trait::async_trait;
use core::hash::{Hash, Hasher};
#[cfg(test)]
use mockall::automock;
pub use crate::up_core_api::usubscription::{
fetch_subscriptions_request::Request, subscription_status::State, EventDeliveryConfig,
FetchSubscribersRequest, FetchSubscribersResponse, FetchSubscriptionsRequest,
FetchSubscriptionsResponse, NotificationsRequest, NotificationsResponse, ResetRequest,
ResetResponse, SubscribeAttributes, SubscriberInfo, Subscription, SubscriptionRequest,
SubscriptionResponse, SubscriptionStatus, UnsubscribeRequest, UnsubscribeResponse, Update,
};
use crate::{UStatus, UUri};
impl Hash for SubscriberInfo {
fn hash<H: Hasher>(&self, state: &mut H) {
self.uri.hash(state);
}
}
impl Eq for SubscriberInfo {}
impl SubscriberInfo {
pub fn is_empty(&self) -> bool {
self.eq(&SubscriberInfo::default())
}
}
impl SubscriptionResponse {
pub fn is_state(&self, state: State) -> bool {
self.status
.as_ref()
.is_some_and(|ss| ss.state.enum_value().is_ok_and(|s| s.eq(&state)))
}
}
pub const USUBSCRIPTION_TYPE_ID: u32 = 0x0000_0000;
pub const USUBSCRIPTION_VERSION_MAJOR: u8 = 0x03;
pub const RESOURCE_ID_SUBSCRIBE: u16 = 0x0001;
pub const RESOURCE_ID_UNSUBSCRIBE: u16 = 0x0002;
pub const RESOURCE_ID_FETCH_SUBSCRIPTIONS: u16 = 0x0003;
pub const RESOURCE_ID_REGISTER_FOR_NOTIFICATIONS: u16 = 0x0006;
pub const RESOURCE_ID_UNREGISTER_FOR_NOTIFICATIONS: u16 = 0x0007;
pub const RESOURCE_ID_FETCH_SUBSCRIBERS: u16 = 0x0008;
pub const RESOURCE_ID_RESET: u16 = 0x0009;
pub const RESOURCE_ID_SUBSCRIPTION_CHANGE: u16 = 0x8000;
pub fn usubscription_uri(resource_id: u16) -> UUri {
UUri::try_from_parts(
"",
USUBSCRIPTION_TYPE_ID,
USUBSCRIPTION_VERSION_MAJOR,
resource_id,
)
.unwrap()
}
#[cfg_attr(test, automock)]
#[async_trait]
pub trait USubscription: Send + Sync {
async fn subscribe(
&self,
subscription_request: SubscriptionRequest,
) -> Result<SubscriptionResponse, UStatus>;
async fn unsubscribe(&self, unsubscribe_request: UnsubscribeRequest) -> Result<(), UStatus>;
async fn fetch_subscriptions(
&self,
fetch_subscriptions_request: FetchSubscriptionsRequest,
) -> Result<FetchSubscriptionsResponse, UStatus>;
async fn register_for_notifications(
&self,
notifications_register_request: NotificationsRequest,
) -> Result<(), UStatus>;
async fn unregister_for_notifications(
&self,
notifications_unregister_request: NotificationsRequest,
) -> Result<(), UStatus>;
async fn fetch_subscribers(
&self,
fetch_subscribers_request: FetchSubscribersRequest,
) -> Result<FetchSubscribersResponse, UStatus>;
async fn reset(&self, reset_request: ResetRequest) -> Result<ResetResponse, UStatus>;
}