1use async_trait::async_trait;
2use std::sync::Arc;
3
4use crate::error::AraComError;
5use crate::service::ServiceDefinition;
6use crate::transport::Transport;
7use crate::types::*;
8
9pub struct SkeletonBase<T: Transport> {
15 transport: Arc<T>,
16 service_id: ServiceId,
17 instance_id: InstanceId,
18}
19
20impl<T: Transport> SkeletonBase<T> {
21 pub fn new(transport: Arc<T>, service_id: ServiceId, instance_id: InstanceId) -> Self {
23 Self {
24 transport,
25 service_id,
26 instance_id,
27 }
28 }
29
30 pub fn transport(&self) -> &Arc<T> {
33 &self.transport
34 }
35
36 pub fn service_id(&self) -> ServiceId {
38 self.service_id
39 }
40
41 pub fn instance_id(&self) -> InstanceId {
43 self.instance_id
44 }
45
46 pub async fn offer(
48 &self,
49 major_version: MajorVersion,
50 minor_version: MinorVersion,
51 ) -> Result<(), AraComError> {
52 self.transport
53 .offer_service(
54 self.service_id,
55 self.instance_id,
56 major_version,
57 minor_version,
58 )
59 .await
60 }
61
62 pub async fn stop_offer(&self) -> Result<(), AraComError> {
64 self.transport
65 .stop_offer_service(self.service_id, self.instance_id)
66 .await
67 }
68}
69
70#[async_trait]
75pub trait Skeleton: Send + Sync {
76 type ServiceDef: ServiceDefinition;
77 type TransportImpl: Transport;
78
79 fn new(transport: Arc<Self::TransportImpl>, instance_id: InstanceId) -> Self;
80
81 fn service_id() -> ServiceId {
82 Self::ServiceDef::SERVICE_ID
83 }
84
85 async fn offer(&self) -> Result<(), AraComError>;
86 async fn stop_offer(&self) -> Result<(), AraComError>;
87}