Skip to main content

ara_com/
skeleton.rs

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
9/// Base skeleton that generated skeletons wrap.
10///
11/// Holds the transport and service identity. Generated skeleton structs embed
12/// a `SkeletonBase<T>` and call `offer` / `stop_offer` on it to register the
13/// service instance with the transport layer.
14pub struct SkeletonBase<T: Transport> {
15    transport: Arc<T>,
16    service_id: ServiceId,
17    instance_id: InstanceId,
18}
19
20impl<T: Transport> SkeletonBase<T> {
21    /// Create a new `SkeletonBase`.
22    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    /// Access the underlying transport (used by generated code to send
31    /// notifications and register request handlers).
32    pub fn transport(&self) -> &Arc<T> {
33        &self.transport
34    }
35
36    /// The SOME/IP service ID this skeleton is bound to.
37    pub fn service_id(&self) -> ServiceId {
38        self.service_id
39    }
40
41    /// The instance ID this skeleton is bound to.
42    pub fn instance_id(&self) -> InstanceId {
43        self.instance_id
44    }
45
46    /// Advertise this service instance so that remote proxies can find it.
47    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    /// Withdraw the service advertisement.
63    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/// Trait that generated skeleton structs implement.
71///
72/// Generated skeletons must also expose `offer` / `stop_offer` and carry a
73/// reference to their service definition for type-checked version constants.
74#[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}