use alloc::{collections::BTreeMap, string::String, vec::Vec};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use serde_with::{
OneOrMany,
formats::{PreferMany, PreferOne},
serde_as,
};
pub type Map<K, V> = BTreeMap<K, V>;
#[serde_as]
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq, Deserialize, Serialize)]
#[serde(default, tag = "@type")]
pub struct Pubspec {
pub name: PackageName,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<Version>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub homepage: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub repository: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub issue_tracker: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub documentation: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dependencies: Option<Map<String, Dependency>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dev_dependencies: Option<Map<String, Dependency>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dependency_overrides: Option<Map<String, Dependency>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub environment: Option<Environment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub executables: Option<Map<String, Option<String>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub platforms: Option<Map<String, Option<()>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publish_to: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub funding: Option<Vec<Url>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub false_secrets: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub screenshots: Option<Vec<Screenshot>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub topics: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignored_advisories: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hooks: Option<Map<String, Hook>>,
}
pub type Dependency = VersionConstraint;
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq, Deserialize, Serialize)]
#[serde(default)]
pub struct Environment {
pub sdk: VersionConstraint,
#[serde(skip_serializing_if = "Option::is_none")]
pub flutter: Option<VersionConstraint>,
}
pub type Hook = Map<String, String>;
pub type PackageName = String;
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq, Deserialize, Serialize)]
#[serde(default)]
pub struct Screenshot {
pub path: String,
pub description: String,
}
pub type Version = String;
pub type VersionConstraint = String;
pub type Url = String;