use alloc::{collections::BTreeMap, string::String, vec::Vec};
use indexmap::IndexMap;
pub type Gemspec = Specification;
#[cfg(all(feature = "alloc", feature = "serde"))]
pub type Map<K, V = serde_json::Value> = IndexMap<K, V>;
#[cfg_attr(feature = "serde", serde_with::serde_as)]
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "serde", serde(default, tag = "@type"))]
pub struct Specification<T = Metadata> {
#[cfg_attr(feature = "serde", serde(alias = "author"))]
#[cfg_attr(feature = "serde", serde_as(as = "OneOrMany<_, PreferMany>"))]
pub authors: Vec<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub bindir: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub cert_chain: Option<Vec<String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub dependencies: Option<Vec<Dependency>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub description: Option<String>,
#[cfg_attr(
feature = "serde",
serde(alias = "emails", skip_serializing_if = "Vec::is_empty")
)]
#[cfg_attr(feature = "serde", serde_as(as = "OneOrMany<_, PreferOne>"))]
pub email: Vec<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub executables: Option<Vec<String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub extensions: Option<Vec<String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub extensions_dir: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub extra_rdoc_files: Option<Vec<String>>,
pub files: Vec<String>,
pub homepage: Option<String>,
#[cfg_attr(
feature = "serde",
serde(alias = "license", skip_serializing_if = "Vec::is_empty")
)]
#[cfg_attr(feature = "serde", serde_as(as = "OneOrMany<_, PreferMany>"))]
pub licenses: Vec<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub metadata: Option<T>,
pub name: String,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub platform: Option<Platform>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub post_install_message: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub rdoc_options: Option<Vec<String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub require_paths: Option<Vec<String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub required_ruby_version: Option<Requirement>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub required_rubygems_version: Option<Requirement>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub requirements: Option<Vec<String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub rubygems_version: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub signing_key: Option<String>,
pub summary: String,
pub version: Version,
}
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "serde", serde(default))]
pub struct Dependency {
pub name: String,
pub requirement: Requirement,
pub r#type: String,
pub prerelease: bool,
pub version_requirements: Requirement,
}
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "serde", serde(default))]
pub struct Requirement {
pub requirements: Vec<(String, Version)>,
}
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "serde", serde(default))]
pub struct Version {
pub version: String,
}
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(
feature = "serde",
serde(rename_all(serialize = "lowercase", deserialize = "lowercase"))
)]
pub enum Platform {
#[default]
Ruby,
Current,
#[cfg_attr(feature = "serde", serde(untagged))]
Other(String),
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "serde", serde(default))]
pub struct Metadata {
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub bug_tracker_uri: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub changelog_uri: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub documentation_uri: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub funding_uri: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub homepage_uri: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub mailing_list_uri: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub source_code_uri: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub wiki_uri: Option<String>,
#[cfg(all(feature = "alloc", feature = "serde"))]
#[cfg_attr(
feature = "serde",
serde(flatten, skip_serializing_if = "Map::is_empty")
)]
pub other: Map<String>,
}