rtlibs-utils 0.1.6

rtools library: utilities
Documentation
use std::path::PathBuf;
use std::str::FromStr;

use inquire::validator::Validation;

type ValidationError = Box<dyn std::error::Error + Send + Sync>;

pub(crate) fn url(v: &str) -> Result<Validation, ValidationError>
{
    match validators::url::Url::parse(v)
    {
        Ok(_) => Ok(Validation::Valid),
        Err(e) => Ok(Validation::Invalid(e.into())),
    }
}

pub(crate) fn path(v: &str) -> Result<Validation, ValidationError>
{
    match PathBuf::from_str(v)
    {
        Ok(_) => Ok(Validation::Valid),
        Err(e) => Ok(Validation::Invalid(e.into())),
    }
}

pub(crate) fn path_existing(v: &str) -> Result<Validation, ValidationError>
{
    match PathBuf::from_str(v)
    {
        Ok(path) =>
        {
            if path.exists()
            {
                Ok(Validation::Valid)
            }
            else
            {
                Ok(Validation::Invalid("Path does not exist".into()))
            }
        }
        Err(e) => Ok(Validation::Invalid(e.into())),
    }
}

pub(crate) fn path_existing_dir(v: &str) -> Result<Validation, ValidationError>
{
    match PathBuf::from_str(v)
    {
        Ok(path) =>
        {
            if path.exists() && path.is_dir()
            {
                Ok(Validation::Valid)
            }
            else
            {
                Ok(Validation::Invalid("Path is not a directory".into()))
            }
        }
        Err(e) => Ok(Validation::Invalid(e.into())),
    }
}

pub(crate) fn path_existing_file(v: &str) -> Result<Validation, ValidationError>
{
    match PathBuf::from_str(v)
    {
        Ok(path) =>
        {
            if path.exists() && path.is_file()
            {
                Ok(Validation::Valid)
            }
            else
            {
                Ok(Validation::Invalid("Path is not a file".into()))
            }
        }
        Err(e) => Ok(Validation::Invalid(e.into())),
    }
}

pub(crate) fn path_creating_dir(v: &str) -> Result<Validation, ValidationError>
{
    match PathBuf::from_str(v)
    {
        Ok(path) => match std::fs::create_dir_all(&path)
        {
            Ok(_) => Ok(Validation::Valid),
            Err(_) => Ok(Validation::Invalid("Cannot create directory".into())),
        },
        Err(e) => Ok(Validation::Invalid(e.into())),
    }
}

pub(crate) fn path_creating_file(v: &str) -> Result<Validation, ValidationError>
{
    match PathBuf::from_str(v)
    {
        Ok(path) => match std::fs::write(
            &path, "",
        )
        {
            Ok(_) => Ok(Validation::Valid),
            Err(_) => Ok(Validation::Invalid("Cannot create file".into())),
        },
        Err(e) => Ok(Validation::Invalid(e.into())),
    }
}