pray-cli 1.20.0

Package manager for the language placed before inference — Prayfile CLI (binary: pray)
use pray_core::derived_metadata::derive_registry_derived_metadata_from_archive_bytes;
use pray_core::hashing::sha256_prefixed;
use pray_core::package_integrity::package_signature_for_publish;
use pray_core::registry::RegistryPackageVersion;
use pray_core::resolve::ResolvedPackage;
use pray_core::ssh_identity::signing_identity;
use pray_core::PrayResult;

pub(crate) fn published_registry_package_version(
    package: &ResolvedPackage,
    signer: &str,
    signer_fingerprint: Option<&str>,
    published_at: u64,
    signing_key: Option<&ed25519_dalek::SigningKey>,
    artifact_path: &str,
    archive_bytes: &[u8],
) -> PrayResult<RegistryPackageVersion> {
    let artifact_hash = sha256_prefixed(archive_bytes);
    let signature_material = package_signature_for_publish(
        signing_key,
        archive_bytes,
        &artifact_hash,
        &package.tree_hash,
        &signing_identity(signer, signer_fingerprint),
    );
    Ok(RegistryPackageVersion {
        version: package.spec.version.clone(),
        artifact: artifact_path.to_string(),
        artifact_hash: Some(artifact_hash),
        tree_hash: Some(package.tree_hash.clone()),
        yanked: false,
        targets: package.spec.targets.clone(),
        exports: package.spec.exports.keys().cloned().collect(),
        signer: Some(signer.to_string()),
        signer_fingerprint: signer_fingerprint.map(str::to_string),
        signer_public_key: signature_material.signer_public_key,
        published_at: Some(published_at),
        signature: Some(signature_material.signature),
        derived_metadata: Some(derive_registry_derived_metadata_from_archive_bytes(
            archive_bytes,
        )?),
    })
}