1use serde::{Deserialize, Serialize};
2
3use crate::{ParseError, ValidatedSkill, ValidationError, parse_skill_markdown, validate_skill};
4
5#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
6pub struct SkillInstallOrigin {
7 pub source: String,
8 pub source_label: String,
9 pub r#ref: String,
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub skill_id: Option<String>,
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub version: Option<String>,
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub digest: Option<String>,
16 #[serde(skip_serializing_if = "Option::is_none")]
17 pub profile_digest: Option<String>,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub runner_names: Option<Vec<String>>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub trust_tier: Option<String>,
22}
23
24#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
25pub struct ValidatedSkillInstall {
26 pub skill: ValidatedSkill,
27 pub origin: SkillInstallOrigin,
28 pub markdown: String,
29}
30
31pub fn validate_skill_install(
32 markdown: &str,
33 origin: SkillInstallOrigin,
34) -> Result<ValidatedSkillInstall, SkillInstallError> {
35 let raw = parse_skill_markdown(markdown).map_err(SkillInstallError::Parse)?;
36 let skill = validate_skill(raw).map_err(SkillInstallError::Validation)?;
37 Ok(ValidatedSkillInstall {
38 skill,
39 origin,
40 markdown: markdown.to_owned(),
41 })
42}
43
44#[derive(Debug, thiserror::Error)]
45pub enum SkillInstallError {
46 #[error("{0}")]
47 Parse(ParseError),
48 #[error("{0}")]
49 Validation(ValidationError),
50}