t-rex 0.1.1

A script for inserting a new page in a number-indexed Docusaurus directory
Documentation
use std::{
    fs,
    fs::{DirEntry, OpenOptions},
    path::Path,
};

use anyhow::{anyhow, bail, Result};
use console::style;

use crate::utils::{
    entry_to_file_name, get_padding_digits, get_sorted_files_in_dir, is_valid_name, num_prefix,
    rename_files_from_index,
};

pub fn process_insert(page_path: String) -> Result<()> {
    let page_path = Path::new(&page_path);
    let page_path_string = page_path.to_string_lossy().to_string();
    let page_name_os_str = page_path.file_name().ok_or_else(|| {
        anyhow!(
            "Couldn't get the file name of the given page path '{}'!",
            page_path_string
        )
    })?;
    let page_name_string = page_name_os_str.to_string_lossy().to_string();

    if !is_valid_name(&page_name_string) {
        bail!(
            "Invalid file name from the given filepath '{}!",
            page_path_string
        );
    };
    let mut parent_path = page_path.parent().unwrap_or_else(|| Path::new("."));
    if &parent_path.to_string_lossy() == "" {
        parent_path = Path::new(".");
    }
    let insert_prefix = num_prefix(&page_name_string)?;

    let all_files = get_sorted_files_in_dir(parent_path)?;
    let (digits_used, digits_needed) = get_padding_digits(&all_files);

    let (after_files, before_files): (Vec<DirEntry>, Vec<DirEntry>) =
        all_files.into_iter().partition(|f| {
            num_prefix(&entry_to_file_name(f)).unwrap_or_else(|_| {
                panic!("invalid file {} in sorted files", entry_to_file_name(f))
            }) >= insert_prefix
        });

    let mut renamed_count =
        rename_files_from_index(after_files, Some(insert_prefix), parent_path, digits_needed)?;
    if digits_used < digits_needed {
        renamed_count += rename_files_from_index(before_files, None, parent_path, digits_needed)?;
    }
    println!("Successfully renamed {} files!", renamed_count);

    let create_error = |err| {
        anyhow!(
            "Error creating the new Docusaurus file '{}' - {}",
            page_path.to_string_lossy(),
            err
        )
    };
    let fixed_path = parent_path.join(page_name_os_str);
    let mut insert_text = "page";
    if fixed_path.extension().is_none() {
        fs::create_dir(fixed_path).map_err(create_error)?;
        insert_text = "directory";
    } else {
        OpenOptions::new()
            .write(true)
            .create_new(true)
            .open(fixed_path)
            .map_err(create_error)?;
    }
    println!(
        "{}",
        style(format!("Successfully inserted a new {}!", insert_text))
            .green()
            .bold()
            .dim()
    );

    Ok(())
}