use crate::config::{
NfpmContent, NfpmSignatureConfig, StringOrBool, deserialize_string_or_bool_opt,
};
use schemars::JsonSchema;
use serde::{Deserialize, Deserializer, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct MakeselfConfig {
pub id: Option<String>,
pub ids: Option<Vec<String>>,
pub filename: Option<String>,
pub name: Option<String>,
pub script: Option<String>,
pub description: Option<String>,
pub maintainer: Option<String>,
pub keywords: Option<Vec<String>>,
pub homepage: Option<String>,
pub license: Option<String>,
pub compression: Option<String>,
pub extra_args: Option<Vec<String>>,
pub files: Option<Vec<MakeselfFile>>,
pub os: Option<Vec<String>>,
pub arch: Option<Vec<String>>,
#[serde(
alias = "disable",
deserialize_with = "deserialize_string_or_bool_opt",
default
)]
pub skip: Option<StringOrBool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct MakeselfFile {
#[serde(alias = "src")]
pub source: String,
#[serde(alias = "dst")]
pub destination: Option<String>,
pub strip_parent: Option<bool>,
}
pub(crate) fn deserialize_makeselfs<'de, D>(
deserializer: D,
) -> Result<Vec<MakeselfConfig>, D::Error>
where
D: Deserializer<'de>,
{
use serde::de::{self, Visitor};
struct MakeselfVisitor;
impl<'de> Visitor<'de> for MakeselfVisitor {
type Value = Vec<MakeselfConfig>;
fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("a makeself config object or an array of makeself config objects")
}
fn visit_seq<A: de::SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
let mut configs = Vec::new();
while let Some(item) = seq.next_element::<MakeselfConfig>()? {
configs.push(item);
}
Ok(configs)
}
fn visit_map<M: de::MapAccess<'de>>(self, map: M) -> Result<Self::Value, M::Error> {
let config = MakeselfConfig::deserialize(de::value::MapAccessDeserializer::new(map))?;
Ok(vec![config])
}
fn visit_unit<E: de::Error>(self) -> Result<Self::Value, E> {
Ok(Vec::new())
}
fn visit_none<E: de::Error>(self) -> Result<Self::Value, E> {
Ok(Vec::new())
}
}
deserializer.deserialize_any(MakeselfVisitor)
}
pub(crate) fn makeselfs_schema(
generator: &mut schemars::r#gen::SchemaGenerator,
) -> schemars::schema::Schema {
let mut schema = generator.subschema_for::<Vec<MakeselfConfig>>();
if let schemars::schema::Schema::Object(ref mut obj) = schema {
obj.metadata().description = Some(
"Makeself self-extracting archive configurations. Accepts a single object or array."
.to_owned(),
);
}
schema
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct AppImageConfig {
pub id: Option<String>,
pub ids: Option<Vec<String>>,
pub filename: Option<String>,
pub name: Option<String>,
pub desktop: Option<String>,
pub icon: Option<String>,
pub appdir_extra: Option<Vec<AppImageExtra>>,
pub update_information: Option<String>,
pub runtime_harvest: Option<RuntimeHarvest>,
pub extra_args: Option<Vec<String>>,
pub os: Option<Vec<String>>,
pub arch: Option<Vec<String>>,
#[serde(
alias = "disable",
deserialize_with = "deserialize_string_or_bool_opt",
default
)]
pub skip: Option<StringOrBool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct AppImageExtra {
#[serde(alias = "source")]
pub src: String,
#[serde(alias = "destination")]
pub dst: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct RuntimeHarvest {
pub command: String,
pub dir: String,
}
pub(crate) fn deserialize_appimages<'de, D>(
deserializer: D,
) -> Result<Vec<AppImageConfig>, D::Error>
where
D: Deserializer<'de>,
{
use serde::de::{self, Visitor};
struct AppImageVisitor;
impl<'de> Visitor<'de> for AppImageVisitor {
type Value = Vec<AppImageConfig>;
fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("an appimage config object or an array of appimage config objects")
}
fn visit_seq<A: de::SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
let mut configs = Vec::new();
while let Some(item) = seq.next_element::<AppImageConfig>()? {
configs.push(item);
}
Ok(configs)
}
fn visit_map<M: de::MapAccess<'de>>(self, map: M) -> Result<Self::Value, M::Error> {
let config = AppImageConfig::deserialize(de::value::MapAccessDeserializer::new(map))?;
Ok(vec![config])
}
fn visit_unit<E: de::Error>(self) -> Result<Self::Value, E> {
Ok(Vec::new())
}
fn visit_none<E: de::Error>(self) -> Result<Self::Value, E> {
Ok(Vec::new())
}
}
deserializer.deserialize_any(AppImageVisitor)
}
pub(crate) fn appimages_schema(
generator: &mut schemars::r#gen::SchemaGenerator,
) -> schemars::schema::Schema {
let mut schema = generator.subschema_for::<Vec<AppImageConfig>>();
if let schemars::schema::Schema::Object(ref mut obj) = schema {
obj.metadata().description =
Some("AppImage packaging configurations. Accepts a single object or array.".to_owned());
}
schema
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct SrpmConfig {
pub enabled: Option<bool>,
pub package_name: Option<String>,
pub file_name_template: Option<String>,
pub spec_file: Option<String>,
pub epoch: Option<String>,
pub section: Option<String>,
pub maintainer: Option<String>,
pub vendor: Option<String>,
pub summary: Option<String>,
pub group: Option<String>,
pub description: Option<String>,
pub license: Option<String>,
pub license_file_name: Option<String>,
pub url: Option<String>,
pub packager: Option<String>,
pub compression: Option<String>,
pub docs: Option<Vec<String>>,
pub contents: Option<Vec<NfpmContent>>,
pub signature: Option<NfpmSignatureConfig>,
pub bins: Option<BTreeMap<String, String>>,
pub prefixes: Option<Vec<String>>,
pub build_host: Option<String>,
pub pretrans: Option<String>,
pub posttrans: Option<String>,
pub prerelease: Option<String>,
pub version_metadata: Option<String>,
#[serde(deserialize_with = "deserialize_string_or_bool_opt", default)]
pub skip: Option<StringOrBool>,
}