use std::future::Future;
use bytes::Bytes;
use serde::Deserialize;
use serde::Serialize;
use tokio_util::sync::CancellationToken;
use crate::error::ProviderError;
use crate::shared::Headers;
use crate::shared::ProviderId;
use crate::shared::ProviderMetadata;
use crate::shared::ProviderOptions;
use crate::shared::ProviderReference;
use crate::shared::Warning;
use crate::shared::base64_bytes;
pub trait Skills: Send + Sync + 'static {
fn provider(&self) -> &ProviderId;
fn upload_skill(
&self,
options: UploadSkillOptions,
) -> impl Future<Output = Result<UploadSkillResult, ProviderError>> + Send;
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "lowercase")]
#[non_exhaustive]
pub enum SkillFileData {
Data {
#[serde(with = "base64_bytes")]
data: Bytes,
},
Text {
text: String,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SkillFile {
pub path: String,
pub data: SkillFileData,
}
#[derive(Debug, Clone)]
pub struct UploadSkillOptions {
pub files: Vec<SkillFile>,
pub display_title: Option<String>,
pub headers: Headers,
pub provider_options: ProviderOptions,
pub cancellation: CancellationToken,
}
impl UploadSkillOptions {
#[must_use]
pub fn new(files: Vec<SkillFile>) -> Self {
Self {
files,
display_title: None,
headers: Headers::new(),
provider_options: ProviderOptions::new(),
cancellation: CancellationToken::new(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UploadSkillResult {
pub provider_reference: ProviderReference,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_title: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub latest_version: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub provider_metadata: Option<ProviderMetadata>,
#[serde(default)]
pub warnings: Vec<Warning>,
}