use super::source::*;
use crate::PluginContext;
use derive_setters::Setters;
use rustc_hash::FxHashMap;
use semver::VersionReq;
use std::path::PathBuf;
use system_env::SystemDependency;
use warpgate_api::{Id, VirtualPath, api_enum, api_struct};
api_struct!(
pub struct BuildInstructionsInput {
pub context: PluginContext,
pub install_dir: VirtualPath,
}
);
api_struct!(
#[derive(Setters)]
pub struct BuilderInstruction {
#[setters(into)]
pub id: Id,
pub exe: PathBuf,
#[serde(default, skip_serializing_if = "FxHashMap::is_empty")]
pub exes: FxHashMap<String, PathBuf>,
pub git: GitSource,
}
);
api_struct!(
#[derive(Setters)]
pub struct CommandInstruction {
pub builder: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub args: Vec<String>,
#[serde(default, skip_serializing_if = "FxHashMap::is_empty")]
pub env: FxHashMap<String, String>,
#[setters(into)]
#[serde(alias = "bin")]
pub exe: String,
#[setters(strip_option)]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cwd: Option<PathBuf>,
}
);
impl CommandInstruction {
pub fn new<T: AsRef<str>, I: IntoIterator<Item = V>, V: AsRef<str>>(exe: T, args: I) -> Self {
Self {
builder: false,
exe: exe.as_ref().to_owned(),
args: args
.into_iter()
.map(|arg| arg.as_ref().to_owned())
.collect(),
env: FxHashMap::default(),
cwd: None,
}
}
pub fn with_builder<T: AsRef<str>, I: IntoIterator<Item = V>, V: AsRef<str>>(
id: T,
args: I,
) -> Self {
let mut cmd = Self::new(id, args);
cmd.builder = true;
cmd
}
}
api_enum!(
#[serde(tag = "type", content = "instruction", rename_all = "kebab-case")]
pub enum BuildInstruction {
InstallBuilder(Box<BuilderInstruction>),
MakeExecutable(PathBuf),
MoveFile(PathBuf, PathBuf),
RemoveAllExcept(Vec<PathBuf>),
RemoveDir(PathBuf),
RemoveFile(PathBuf),
RequestScript(String),
#[cfg_attr(feature = "schematic", schema(nested))]
RunCommand(Box<CommandInstruction>),
SetEnvVar(String, String),
}
);
api_enum!(
#[serde(tag = "type", content = "requirement", rename_all = "kebab-case")]
pub enum BuildRequirement {
CommandExistsOnPath(String),
CommandVersion(String, VersionReq, Option<String>),
ManualIntercept(String), GitConfigSetting(String, String),
GitVersion(VersionReq),
XcodeCommandLineTools,
WindowsDeveloperMode,
}
);
api_struct!(
#[serde(default)]
pub struct BuildInstructionsOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub help_url: Option<String>,
#[serde(default, skip_serializing_if = "FxHashMap::is_empty")]
pub http_headers: FxHashMap<String, String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub instructions: Vec<BuildInstruction>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub requirements: Vec<BuildRequirement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<SourceLocation>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub system_dependencies: Vec<SystemDependency>,
}
);