Skip to main content

runx_parser/
install.rs

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}