pray-cli 1.15.0

Package manager for the language placed before inference — Prayfile CLI (binary: pray)
use crate::project_paths::lockfile_path;
use pray_core::lockfile::read_lockfile;
use pray_core::manifest::Manifest;
use pray_core::resolve::resolve_upstream::{
    apply_path_upstream_latest_constraints, plan_path_upstream_latest_constraints,
    PathUpstreamLatestConstraint,
};
use pray_core::resolve::{apply_path_upstream_refreshes, ResolvedProject};
use pray_core::resolve_context::ResolveOptions;
use pray_core::PrayResult;
use std::path::Path;

pub(super) fn plan_latest_upstream_constraints(
    project: &ResolvedProject,
    selected: Option<&str>,
    options: &ResolveOptions,
) -> PrayResult<Vec<PathUpstreamLatestConstraint>> {
    let previous = read_lockfile(&lockfile_path()).ok();
    plan_path_upstream_latest_constraints(project, previous.as_ref(), selected, options)
}

pub(super) fn print_latest_upstream_constraints(plans: &[PathUpstreamLatestConstraint]) {
    for plan in plans {
        println!(
            "{} upstream {} -> {} (latest {})",
            plan.package_name, plan.current_constraint, plan.new_constraint, plan.latest_version
        );
    }
}

pub(super) fn latest_upstream_constraint_updates_json(
    plans: &[PathUpstreamLatestConstraint],
) -> Vec<serde_json::Value> {
    plans
        .iter()
        .map(|plan| {
            serde_json::json!({
                "name": plan.package_name,
                "from_constraint": plan.current_constraint,
                "to_constraint": plan.new_constraint,
                "latest_version": plan.latest_version,
            })
        })
        .collect()
}

pub(super) fn resolve_after_latest_upstream(
    manifest_path: &Path,
    project_root: &Path,
    manifest: Manifest,
    options: &ResolveOptions,
    selected: Option<&str>,
    plans: &[PathUpstreamLatestConstraint],
    dry_run: bool,
) -> PrayResult<ResolvedProject> {
    if !dry_run {
        apply_path_upstream_latest_constraints(plans)?;
    }
    let mut candidate = pray_core::resolve::resolve_manifest_in_context(
        manifest_path,
        project_root,
        manifest.clone(),
        options,
    )?;
    if dry_run {
        return Ok(candidate);
    }
    let previous = read_lockfile(&lockfile_path()).ok();
    if apply_path_upstream_refreshes(&candidate, previous.as_ref(), selected, options)? {
        candidate = pray_core::resolve::resolve_manifest_in_context(
            manifest_path,
            project_root,
            manifest,
            options,
        )?;
    }
    Ok(candidate)
}