use crate::context::{MoonContext, Operation};
use crate::is_false;
use crate::prompts::SettingPrompt;
use moon_common::Id;
use moon_config::{DependencyScope, PartialTaskConfig};
use moon_project::ProjectFragment;
use moon_task::TaskFragment;
use rustc_hash::FxHashMap;
use schematic::Schema;
use std::collections::BTreeMap;
use std::path::PathBuf;
use warpgate_api::*;
pub type ConfigSchema = Schema;
api_struct!(
pub struct InitializePluginInput {
pub context: MoonContext,
}
);
api_struct!(
#[serde(default)]
pub struct InitializePluginOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub config_url: Option<String>,
#[serde(skip_serializing_if = "FxHashMap::is_empty")]
pub default_settings: FxHashMap<String, serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub docs_url: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub prompts: Vec<SettingPrompt>,
}
);
api_struct!(
pub struct ExtendProjectGraphInput {
pub context: MoonContext,
pub extension_config: serde_json::Value,
pub project_sources: BTreeMap<Id, String>,
pub toolchain_config: serde_json::Value,
}
);
api_struct!(
#[serde(default)]
pub struct ExtendProjectGraphOutput {
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
pub extended_projects: BTreeMap<Id, ExtendProjectOutput>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub input_files: Vec<PathBuf>,
}
);
api_struct!(
pub struct ProjectDependency {
pub id: Id,
pub scope: DependencyScope,
pub via: Option<String>,
}
);
api_struct!(
#[serde(default)]
pub struct ExtendProjectOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub alias: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub dependencies: Vec<ProjectDependency>,
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
pub tasks: BTreeMap<Id, PartialTaskConfig>,
}
);
api_enum!(
#[serde(tag = "strategy", content = "value")]
pub enum Extend<T> {
Empty,
Append(T),
Prepend(T),
Replace(T),
}
);
api_struct!(
pub struct ExtendCommandInput {
pub args: Vec<String>,
pub context: MoonContext,
pub command: String,
pub current_dir: VirtualPath,
pub extension_config: serde_json::Value,
pub toolchain_config: serde_json::Value,
}
);
api_struct!(
#[serde(default)]
pub struct ExtendCommandOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub command: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub args: Option<Extend<Vec<String>>>,
#[serde(skip_serializing_if = "FxHashMap::is_empty")]
pub env: FxHashMap<String, String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub env_remove: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub paths: Vec<PathBuf>,
}
);
api_struct!(
pub struct ExtendTaskCommandInput {
pub args: Vec<String>,
pub context: MoonContext,
pub command: String,
pub extension_config: serde_json::Value,
pub globals_dir: Option<VirtualPath>,
pub project: ProjectFragment,
pub task: TaskFragment,
pub toolchain_config: serde_json::Value,
}
);
pub type ExtendTaskCommandOutput = ExtendCommandOutput;
api_struct!(
pub struct ExtendTaskScriptInput {
pub context: MoonContext,
pub extension_config: serde_json::Value,
pub globals_dir: Option<VirtualPath>,
pub project: ProjectFragment,
pub script: String,
pub task: TaskFragment,
pub toolchain_config: serde_json::Value,
}
);
api_struct!(
#[serde(default)]
pub struct ExtendTaskScriptOutput {
#[serde(skip_serializing_if = "FxHashMap::is_empty")]
pub env: FxHashMap<String, String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub env_remove: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub paths: Vec<PathBuf>,
#[serde(skip_serializing_if = "Option::is_none")]
pub script: Option<String>,
}
);
api_struct!(
pub struct SyncWorkspaceInput {
pub context: MoonContext,
pub extension_config: serde_json::Value,
pub toolchain_config: serde_json::Value,
}
);
api_struct!(
pub struct SyncProjectInput {
pub context: MoonContext,
pub extension_config: serde_json::Value,
pub project_dependencies: Vec<ProjectFragment>,
pub project: ProjectFragment,
pub toolchain_config: serde_json::Value,
pub toolchain_workspace_config: serde_json::Value,
}
);
api_struct!(
#[serde(default)]
pub struct SyncOutput {
#[serde(skip_serializing_if = "Vec::is_empty")]
pub changed_files: Vec<PathBuf>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub operations: Vec<Operation>,
#[serde(skip_serializing_if = "is_false")]
pub skipped: bool,
}
);