plow_cli 0.5.2

Plow package management command line applications.
#![allow(dead_code)]
use camino::Utf8Path;
use colored::*;

use crate::{
    error::{CliError, FieldAccessError},
    manifest::FieldManifest,
};

pub trait Feedback {
    fn feedback(&self);
}

pub fn listing_failed(info: &str) {
    println!("\t{}", "Listing failed".red().bold(),);
    println!("\t{} {info}", "Info".yellow().bold(),);
    std::process::exit(0xFF);
}

pub fn submission_failed(info: &str) {
    println!("\t{}", "Submission failed".red().bold(),);
    println!("\t{} {info}", "Info".yellow().bold(),);
    std::process::exit(0xFF);
}

pub fn login_failed(advice: &str) {
    println!("\t{}", "Login failed".red().bold(),);
    println!("\t{} {advice}", "Advice".yellow().bold(),);
    std::process::exit(0xFF);
}

pub fn submission_remote_linting_failed(failures: &[String]) {
    println!("\t{}", "Submission failed".red().bold(),);
    println!("\t{}", "Info".yellow().bold(),);
    for failure in failures {
        println!("\t  {}", failure);
    }
    std::process::exit(0xFF);
}

pub fn command_failed(info: &str) {
    println!("\t{}", "Command failed".red().bold(),);
    println!("\t{} {info}", "Info".yellow().bold(),);
    std::process::exit(0xFF);
}

pub fn dependency_resolution_failed(reason: &str) {
    println!("\t{}", "Failed to resolve dependencies".red().bold(),);
    println!("\t{} {reason}", "Reason".yellow().bold(),);
    std::process::exit(0xFF);
}

pub fn linting_failed() {
    println!("\t{}", "Linting failed".red().bold(),);
    println!(
        "\t{} Depending on the red lines in the linting output, update your field and try again.",
        "Advice".yellow().bold(),
    );
    std::process::exit(0xFF);
}

pub fn field_info(local_path: &Utf8Path) -> Result<(), CliError> {
    if !local_path.exists() {
        return Err(CliError::from(FieldAccessError::FailedToFindFieldAtPath {
            field_path: local_path.to_string(),
        }));
    }
    let contents = std::fs::read_to_string(&local_path).map_err(|_| {
        CliError::from(FieldAccessError::FailedToReadFieldAtPath {
            field_path: local_path.to_string(),
        })
    })?;

    let manifest = FieldManifest::new(&contents).map_err(|_| {
        CliError::from(FieldAccessError::FailedToReadFieldManifest {
            field_path: local_path.to_string(),
        })
    })?;

    let full_name = manifest
        .field_namespace_and_name()
        .unwrap_or_else(|| "Not specified".to_owned().italic().to_string());
    let version = manifest
        .field_version()
        .unwrap_or_else(|| "Not specified".to_owned().italic().to_string());
    let dependencies = manifest.field_dependency_literals();

    println!("\t{} {full_name}", "Name".bold());
    println!("\t{} {version}", "Version".bold());
    println!("\t{} {local_path}", "Location".bold());
    if let Some(dependencies) = dependencies {
        println!("\t{}", "Requested Dependencies".bold());
        for dependency in &dependencies {
            println!("\t\t{dependency}");
        }
    }
    Ok(())
}

#[allow(dead_code)]
pub fn info(info: &str) {
    println!("\t{} {info}", "Info".yellow().bold(),);
}

pub fn command_not_complete(advice: &str) {
    println!("\t{}", "Command is not complete".red().bold(),);
    println!("\t{} {advice}", "Advice".yellow().bold(),);
    std::process::exit(0xFF);
}

pub fn argument_not_recognized(advice: &str) {
    println!("\t{}", "Argument not recognized".red().bold(),);
    println!("\t{} {advice}", "Advice".yellow().bold(),);
    std::process::exit(0xFF);
}

pub fn submission_lint_start() {
    println!(
        "\t{} the field before submission..",
        "Linting".green().bold(),
    );
}

pub fn lint_start(lint_set_name: &str) {
    println!();
    println!(
        "\t{} the provided field with {lint_set_name}..",
        "Linting".green().bold(),
    );
}

pub fn general_lint_start() {
    println!("\t{} the provided field..", "Linting".green().bold(),);
}

pub fn general_lint_success() {
    println!();
    println!("\t{} successful.", "Linting".green().bold(),);
}
pub fn general_update_success() {
    println!();
    println!("\t{} successful.", "Update".green().bold(),);
}