Skip to main content

ferrin_spec/dynamic/
skills.rs

1//! Object-safe skills service.
2
3use super::BoxFuture;
4use super::ServiceRef;
5use super::model_ref::ref_conversions;
6use crate::error::ProviderError;
7use crate::shared::ProviderId;
8use crate::skills::Skills;
9use crate::skills::UploadSkillOptions;
10use crate::skills::UploadSkillResult;
11
12/// Object-safe counterpart of [`Skills`].
13pub trait DynSkills: Send + Sync + 'static {
14    /// See [`Skills::provider`].
15    fn provider(&self) -> &ProviderId;
16    /// See [`Skills::upload_skill`].
17    fn upload_skill(
18        &self,
19        options: UploadSkillOptions,
20    ) -> BoxFuture<'_, Result<UploadSkillResult, ProviderError>>;
21}
22
23impl<T: Skills> DynSkills for T {
24    fn provider(&self) -> &ProviderId {
25        Skills::provider(self)
26    }
27
28    fn upload_skill(
29        &self,
30        options: UploadSkillOptions,
31    ) -> BoxFuture<'_, Result<UploadSkillResult, ProviderError>> {
32        Box::pin(Skills::upload_skill(self, options))
33    }
34}
35
36/// Shared reference to a skills service.
37pub type SkillsRef = ServiceRef<dyn DynSkills>;
38
39ref_conversions!(SkillsRef, Skills, DynSkills);