use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use crate::index_metadata::IndexDep;
use crate::publish_metadata::RegistryDep;
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub struct CrateData {
pub name: String,
pub owners: Vec<String>,
pub max_version: String,
pub total_downloads: i64,
pub last_updated: String,
pub homepage: Option<String>,
pub description: Option<String>,
pub repository: Option<String>,
pub categories: Vec<String>,
pub keywords: Vec<String>,
pub authors: Vec<String>,
pub versions: Vec<CrateVersionData>,
}
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub struct CrateVersionData {
pub version: String,
pub created: String,
pub downloads: i64,
pub readme: Option<String>,
pub license: Option<String>,
pub license_file: Option<String>,
pub documentation: Option<String>,
pub dependencies: Vec<CrateRegistryDep>,
pub checksum: String,
pub features: BTreeMap<String, Vec<String>>,
pub yanked: bool,
pub links: Option<String>,
pub v: i32,
}
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub struct CrateRegistryDep {
pub name: String,
pub description: Option<String>,
pub version_req: String,
pub features: Option<Vec<String>>,
pub optional: bool,
pub default_features: bool,
pub target: Option<String>,
pub kind: Option<String>,
pub registry: Option<String>,
pub explicit_name_in_toml: Option<String>,
}
impl From<RegistryDep> for CrateRegistryDep {
fn from(dep: RegistryDep) -> Self {
CrateRegistryDep {
name: dep.name,
description: None,
version_req: dep.version_req,
features: dep.features,
optional: dep.optional,
default_features: dep.default_features,
target: dep.target,
kind: dep.kind,
registry: dep.registry,
explicit_name_in_toml: dep.explicit_name_in_toml,
}
}
}
impl CrateRegistryDep {
pub fn from_index(desc: Option<String>, dep: IndexDep) -> Self {
CrateRegistryDep {
name: match dep.package {
Some(ref package) => package.clone(),
None => dep.name.clone(),
},
description: desc,
version_req: dep.req,
features: Some(dep.features),
optional: dep.optional,
default_features: dep.default_features,
target: dep.target,
kind: dep.kind.map(|k| k.to_string()),
registry: dep.registry,
explicit_name_in_toml: match dep.package {
Some(_) => Some(dep.name),
None => None,
},
}
}
}