use indexmap::IndexMap;
use serde::Deserialize;
use crate::common::{
Env, If, Uses,
expr::{BoE, LoE},
};
#[derive(Deserialize, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct Action {
pub name: Option<String>,
pub author: Option<String>,
pub description: Option<String>,
#[serde(default)]
pub inputs: IndexMap<String, Input>,
#[serde(default)]
pub outputs: IndexMap<String, Output>,
pub runs: Runs,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct Input {
pub description: Option<String>,
pub required: Option<bool>,
pub default: Option<String>,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct Output {
pub description: Option<String>,
pub value: Option<String>,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "kebab-case", untagged)]
pub enum Runs {
JavaScript(JavaScript),
Composite(Composite),
Docker(Docker),
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct JavaScript {
pub using: String,
pub main: String,
pub pre: Option<String>,
pub pre_if: Option<If>,
pub post: Option<String>,
pub post_if: Option<If>,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct Composite {
pub using: String,
pub steps: Vec<Step>,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct Step {
pub id: Option<String>,
pub r#if: Option<If>,
pub name: Option<String>,
#[serde(default)]
pub continue_on_error: BoE,
#[serde(default)]
pub env: LoE<Env>,
#[serde(flatten)]
pub body: StepBody,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "kebab-case", untagged)]
pub enum StepBody {
Uses {
#[serde(deserialize_with = "crate::common::step_uses")]
uses: Uses,
#[serde(default)]
with: LoE<Env>,
},
Run {
run: String,
shell: LoE<String>,
working_directory: Option<String>,
},
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct Docker {
pub using: String,
pub image: String,
#[serde(default)]
pub env: Env,
pub entrypoint: Option<String>,
pub pre_entrypoint: Option<String>,
pub pre_if: Option<If>,
pub post_entrypoint: Option<String>,
pub post_if: Option<If>,
}