use crate::config::{
NfpmContent, NfpmSignatureConfig, StringOrBool, deserialize_string_or_bool_opt,
};
use schemars::JsonSchema;
use serde::{Deserialize, Deserializer, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
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 goos: Option<Vec<String>>,
pub goarch: Option<Vec<String>>,
#[serde(deserialize_with = "deserialize_string_or_bool_opt", default)]
pub skip: Option<StringOrBool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct MakeselfFile {
pub source: String,
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)]
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<Vec<String>>,
pub import_path: Option<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>,
}