use freighter_api_types::index::request::PublishDependency;
use freighter_api_types::index::response::CrateVersion;
use semver::{Version, VersionReq};
use std::str::FromStr;
#[must_use]
pub fn crate_version(name: &str, version: &str) -> CrateVersion {
CrateVersion {
name: name.to_owned(),
vers: Version::parse(version).unwrap(),
deps: vec![],
cksum: "beefcafe".to_owned(),
features: Default::default(),
yanked: false,
links: None,
v: 2,
features2: Default::default(),
}
}
#[must_use]
pub fn generate_crate_payload(
name: &str,
vers: &str,
tarball: &[u8],
deps: &[(&str, &str, Option<&str>)],
) -> Vec<u8> {
let deps: Vec<_> = deps
.iter()
.map(|(name, req, registry)| PublishDependency {
name: (*name).to_string(),
version_req: VersionReq::from_str(req).unwrap(),
features: vec![],
optional: false,
default_features: false,
target: None,
kind: Default::default(),
registry: registry.map(|x| x.to_string()),
explicit_name_in_toml: None,
})
.collect();
let json = serde_json::json!({
"name": name,
"vers": vers,
"deps": deps,
"features": {},
"description": null,
"documentation": null,
"homepage": null,
"readme": null,
"readme_file": null,
"license": null,
"license_file": null,
"repository": null,
"badges": null,
"links": null,
})
.to_string();
let payload = {
let mut payload = Vec::new();
payload.extend_from_slice(&(json.len() as u32).to_le_bytes());
payload.extend_from_slice(json.as_bytes());
payload.extend_from_slice(&(tarball.len() as u32).to_le_bytes());
payload.extend_from_slice(tarball);
payload
};
payload
}