upstream-rs 2.0.0

Fetch package updates directly from the source.
Documentation
use anyhow::Result;

use crate::services::storage::transaction_storage::{
    TransactionKind, TransactionLog, TransactionPackage, UndoActionKind, package_failed,
    package_skipped, package_success, planned_packages, undo,
};
use crate::utils::static_paths::UpstreamPaths;

pub struct PackageTransaction {
    log: TransactionLog,
}

impl PackageTransaction {
    pub fn start(
        paths: &UpstreamPaths,
        kind: TransactionKind,
        package_names: Vec<String>,
        undo_kind: Option<UndoActionKind>,
    ) -> Result<Self> {
        let undo_action = undo_kind.and_then(|kind| undo(kind, package_names.clone()));
        Ok(Self {
            log: TransactionLog::start(paths, kind, planned_packages(package_names), undo_action)?,
        })
    }

    pub fn complete(self, packages: Vec<TransactionPackage>) -> Result<()> {
        self.log.complete(packages)
    }

    pub fn fail(self, packages: Vec<TransactionPackage>, error: impl Into<String>) -> Result<()> {
        self.log.fail(packages, error)
    }
}

pub fn successful_package(
    name: impl Into<String>,
    old_version: Option<String>,
    new_version: Option<String>,
) -> TransactionPackage {
    let mut package = package_success(name);
    package.old_version = old_version;
    package.new_version = new_version;
    package
}

pub fn failed_package(
    name: impl Into<String>,
    old_version: Option<String>,
    new_version: Option<String>,
    error: impl Into<String>,
) -> TransactionPackage {
    let mut package = package_failed(name, error);
    package.old_version = old_version;
    package.new_version = new_version;
    package
}

pub fn skipped_package(
    name: impl Into<String>,
    old_version: Option<String>,
    new_version: Option<String>,
    reason: impl Into<String>,
) -> TransactionPackage {
    let mut package = package_skipped(name, reason);
    package.old_version = old_version;
    package.new_version = new_version;
    package
}