use std::collections::HashMap;
use semver::{Version, VersionReq};
use serde::{Deserialize, Serialize};
use serde_inline_default::serde_inline_default;
use serde_with::{DisplayFromStr, serde_as};
use spdx::Expression;
use crate::{Id, Install};
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct PackNode {
#[serde(
default,
rename = "dependencies",
skip_serializing_if = "HashMap::is_empty"
)]
pub dep: HashMap<Id, VersionReq>,
}
#[allow(unused)] fn is_zero(n: &u32) -> bool {
*n == 0
}
#[serde_inline_default]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct Package {
pub id: Id,
pub version: Version,
#[serde_inline_default(0)]
#[serde(skip_serializing_if = "is_zero")]
pub rev: u32,
#[serde(flatten)]
pub node: PackNode,
#[serde(rename = "package")]
pub meta: PackMeta,
pub install: Install,
}
#[serde_as]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct PackMeta {
pub name: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub authors: Vec<String>,
#[serde(
default,
rename = "description",
skip_serializing_if = "String::is_empty"
)]
pub desc: String,
#[serde_as(as = "Option<DisplayFromStr>")]
#[serde(skip_serializing_if = "Option::is_none")]
pub license: Option<Expression>,
}