use std::collections::HashMap;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use super::super::{StringOrBool, deserialize_string_or_bool_opt};
use super::{CommitAuthorConfig, RepositoryConfig};
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct HomebrewConfig {
pub repository: Option<RepositoryConfig>,
pub commit_author: Option<CommitAuthorConfig>,
pub directory: Option<String>,
pub name: Option<String>,
pub description: Option<String>,
pub license: Option<String>,
pub install: Option<String>,
pub extra_install: Option<String>,
pub post_install: Option<String>,
pub test: Option<String>,
pub homepage: Option<String>,
pub dependencies: Option<Vec<HomebrewDependency>>,
pub conflicts: Option<Vec<HomebrewConflict>>,
pub caveats: Option<String>,
#[serde(deserialize_with = "deserialize_string_or_bool_opt", default)]
pub skip_upload: Option<StringOrBool>,
pub commit_msg_template: Option<String>,
pub ids: Option<Vec<String>>,
pub url_template: Option<String>,
pub url_headers: Option<Vec<String>>,
pub download_strategy: Option<String>,
pub custom_require: Option<String>,
pub custom_block: Option<String>,
pub plist: Option<String>,
pub service: Option<String>,
pub cask: Option<HomebrewCaskConfig>,
pub amd64_variant: Option<String>,
pub arm_variant: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, JsonSchema)]
#[serde(default)]
pub struct HomebrewDependency {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub os: Option<String>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub dep_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema)]
#[serde(untagged)]
pub enum HomebrewConflict {
Name(String),
WithReason {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
because: Option<String>,
},
}
impl HomebrewConflict {
pub fn name(&self) -> &str {
match self {
Self::Name(n) => n,
Self::WithReason { name, .. } => name,
}
}
pub fn because(&self) -> Option<&str> {
match self {
Self::Name(_) => None,
Self::WithReason { because, .. } => because.as_deref(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct HomebrewCaskConfig {
pub name: Option<String>,
pub alternative_names: Option<Vec<String>>,
pub repository: Option<RepositoryConfig>,
pub commit_author: Option<CommitAuthorConfig>,
pub commit_msg_template: Option<String>,
pub directory: Option<String>,
pub ids: Option<Vec<String>>,
pub url_template: Option<String>,
pub url: Option<HomebrewCaskURL>,
pub app: Option<String>,
pub binaries: Option<Vec<HomebrewCaskBinary>>,
pub description: Option<String>,
pub homepage: Option<String>,
pub license: Option<String>,
pub caveats: Option<String>,
pub custom_block: Option<String>,
pub service: Option<String>,
pub manpages: Option<Vec<String>>,
pub completions: Option<HomebrewCaskCompletions>,
pub generate_completions_from_executable: Option<HomebrewCaskGeneratedCompletions>,
pub dependencies: Option<Vec<HomebrewCaskDependencyEntry>>,
pub conflicts: Option<Vec<HomebrewCaskConflictEntry>>,
pub hooks: Option<HomebrewCaskHooks>,
pub uninstall: Option<HomebrewCaskUninstall>,
pub zap: Option<HomebrewCaskUninstall>,
#[serde(deserialize_with = "deserialize_string_or_bool_opt", default)]
pub skip_upload: Option<StringOrBool>,
#[serde(deserialize_with = "deserialize_string_or_bool_opt", default)]
pub update_existing_pr: Option<StringOrBool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct HomebrewCaskURL {
pub template: Option<String>,
pub verified: Option<String>,
pub using: Option<String>,
pub cookies: Option<HashMap<String, String>>,
pub referer: Option<String>,
pub headers: Option<Vec<String>>,
pub user_agent: Option<String>,
pub data: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct HomebrewCaskUninstall {
pub launchctl: Option<Vec<String>>,
pub quit: Option<Vec<String>>,
pub login_item: Option<Vec<String>>,
pub delete: Option<Vec<String>>,
pub trash: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct HomebrewCaskHooks {
pub pre: Option<HomebrewCaskHook>,
pub post: Option<HomebrewCaskHook>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct HomebrewCaskHook {
pub install: Option<String>,
pub uninstall: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct HomebrewCaskCompletions {
pub bash: Option<String>,
pub zsh: Option<String>,
pub fish: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema)]
#[serde(untagged)]
pub enum HomebrewCaskBinary {
Name(String),
WithTarget {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
target: Option<String>,
},
}
impl HomebrewCaskBinary {
pub fn name(&self) -> &str {
match self {
Self::Name(n) => n,
Self::WithTarget { name, .. } => name,
}
}
pub fn target(&self) -> Option<&str> {
match self {
Self::Name(_) => None,
Self::WithTarget { target, .. } => target.as_deref(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct HomebrewCaskDependencyEntry {
pub cask: Option<String>,
pub formula: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct HomebrewCaskConflictEntry {
pub cask: Option<String>,
pub formula: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct HomebrewCaskGeneratedCompletions {
pub executable: Option<String>,
pub args: Option<Vec<String>>,
pub base_name: Option<String>,
pub shell_parameter_format: Option<String>,
pub shells: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct ScoopConfig {
pub repository: Option<RepositoryConfig>,
pub commit_author: Option<CommitAuthorConfig>,
pub name: Option<String>,
pub directory: Option<String>,
pub description: Option<String>,
pub license: Option<String>,
pub homepage: Option<String>,
pub persist: Option<Vec<String>>,
pub depends: Option<Vec<String>>,
pub pre_install: Option<Vec<String>>,
pub post_install: Option<Vec<String>>,
pub shortcuts: Option<Vec<Vec<String>>>,
#[serde(deserialize_with = "deserialize_string_or_bool_opt", default)]
pub skip_upload: Option<StringOrBool>,
pub commit_msg_template: Option<String>,
pub ids: Option<Vec<String>>,
pub url_template: Option<String>,
#[serde(rename = "use")]
pub use_artifact: Option<String>,
pub amd64_variant: Option<String>,
}