mod build_source;
use crate::shapes::StringOrVec;
use rustc_hash::FxHashMap;
use std::path::PathBuf;
use version_spec::{UnresolvedVersionSpec, VersionSpec};
use warpgate_api::*;
pub use build_source::*;
pub use semver::{Version, VersionReq};
fn is_false(value: &bool) -> bool {
!(*value)
}
api_struct!(
pub struct ToolContext {
pub proto_version: Option<Version>,
pub tool_dir: VirtualPath,
pub version: VersionSpec,
}
);
api_enum!(
#[derive(Default)]
pub enum PluginType {
#[default]
Language,
DependencyManager,
CLI,
}
);
api_struct!(
pub struct ToolMetadataInput {
pub id: String,
}
);
api_struct!(
pub struct ToolInventoryMetadata {
#[serde(skip_serializing_if = "is_false")]
pub disable_progress_bars: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub override_dir: Option<VirtualPath>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version_suffix: Option<String>,
}
);
api_struct!(
pub struct ToolMetadataOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub default_version: Option<UnresolvedVersionSpec>,
pub inventory: ToolInventoryMetadata,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub plugin_version: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub self_upgrade_commands: Vec<String>,
#[serde(rename = "type")]
pub type_of: PluginType,
}
);
api_struct!(
pub struct DetectVersionOutput {
#[serde(skip_serializing_if = "Vec::is_empty")]
pub files: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub ignore: Vec<String>,
}
);
api_struct!(
pub struct ParseVersionFileInput {
pub content: String,
pub file: String,
}
);
api_struct!(
pub struct ParseVersionFileOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<UnresolvedVersionSpec>,
}
);
api_struct!(
pub struct NativeInstallInput {
pub context: ToolContext,
pub install_dir: VirtualPath,
}
);
api_struct!(
pub struct NativeInstallOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
pub installed: bool,
pub skip_install: bool,
}
);
api_struct!(
pub struct NativeUninstallInput {
pub context: ToolContext,
}
);
api_struct!(
pub struct NativeUninstallOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
pub uninstalled: bool,
pub skip_uninstall: bool,
}
);
api_struct!(
pub struct DownloadPrebuiltInput {
pub context: ToolContext,
pub install_dir: VirtualPath,
}
);
api_struct!(
pub struct DownloadPrebuiltOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub archive_prefix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub checksum_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub checksum_public_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub checksum_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub download_name: Option<String>,
pub download_url: String,
}
);
api_struct!(
pub struct UnpackArchiveInput {
pub context: ToolContext,
pub input_file: VirtualPath,
pub output_dir: VirtualPath,
}
);
api_struct!(
pub struct VerifyChecksumInput {
pub context: ToolContext,
pub checksum_file: VirtualPath,
pub download_file: VirtualPath,
}
);
api_struct!(
pub struct VerifyChecksumOutput {
pub verified: bool,
}
);
api_struct!(
pub struct LocateExecutablesInput {
pub context: ToolContext,
}
);
api_struct!(
pub struct ExecutableConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub exe_path: Option<PathBuf>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exe_link_path: Option<PathBuf>,
#[serde(skip_serializing_if = "is_false")]
pub no_bin: bool,
#[serde(skip_serializing_if = "is_false")]
pub no_shim: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_exe_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shim_before_args: Option<StringOrVec>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shim_after_args: Option<StringOrVec>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shim_env_vars: Option<FxHashMap<String, String>>,
}
);
impl ExecutableConfig {
pub fn new<T: AsRef<str>>(exe_path: T) -> Self {
Self {
exe_path: Some(PathBuf::from(exe_path.as_ref())),
..ExecutableConfig::default()
}
}
pub fn with_parent<T: AsRef<str>, P: AsRef<str>>(exe_path: T, parent_exe: P) -> Self {
Self {
exe_path: Some(PathBuf::from(exe_path.as_ref())),
parent_exe_name: Some(parent_exe.as_ref().to_owned()),
..ExecutableConfig::default()
}
}
}
api_struct!(
pub struct LocateExecutablesOutput {
#[serde(skip_serializing_if = "Vec::is_empty")]
pub globals_lookup_dirs: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub globals_prefix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub primary: Option<ExecutableConfig>,
#[serde(skip_serializing_if = "FxHashMap::is_empty")]
pub secondary: FxHashMap<String, ExecutableConfig>,
}
);
api_struct!(
pub struct LoadVersionsInput {
pub initial: UnresolvedVersionSpec,
}
);
api_struct!(
pub struct LoadVersionsOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub canary: Option<Version>,
#[serde(skip_serializing_if = "Option::is_none")]
pub latest: Option<Version>,
#[serde(skip_serializing_if = "FxHashMap::is_empty")]
pub aliases: FxHashMap<String, Version>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub versions: Vec<Version>,
}
);
impl LoadVersionsOutput {
pub fn from(values: Vec<String>) -> Result<Self, semver::Error> {
let mut versions = vec![];
for value in values {
versions.push(Version::parse(&value)?);
}
Ok(Self::from_versions(versions))
}
pub fn from_versions(versions: Vec<Version>) -> Self {
let mut output = LoadVersionsOutput::default();
let mut latest = Version::new(0, 0, 0);
for version in versions {
if version.pre.is_empty() && version.build.is_empty() && version > latest {
latest = version.clone();
}
output.versions.push(version);
}
output.latest = Some(latest.clone());
output.aliases.insert("latest".into(), latest);
output
}
}
api_struct!(
pub struct ResolveVersionInput {
pub initial: UnresolvedVersionSpec,
}
);
api_struct!(
pub struct ResolveVersionOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub candidate: Option<UnresolvedVersionSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<VersionSpec>,
}
);
api_struct!(
pub struct SyncManifestInput {
pub context: ToolContext,
}
);
api_struct!(
pub struct SyncManifestOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub versions: Option<Vec<Version>>,
pub skip_sync: bool,
}
);
api_struct!(
pub struct SyncShellProfileInput {
pub context: ToolContext,
pub passthrough_args: Vec<String>,
}
);
api_struct!(
pub struct SyncShellProfileOutput {
pub check_var: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub export_vars: Option<FxHashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extend_path: Option<Vec<String>>,
pub skip_sync: bool,
}
);