fimdoc 0.6.1

Firendship is Magic Document, converts Markdown into FIMFiction BBCode.
Documentation
use camino::Utf8Path;
use fimdoc::parser::{parse, WarningType};
use golden_oak_library::stderr::{print_error, ErrColor};
use golden_oak_library::stdin::get_stdin;
use indoc::printdoc;
use std::process::exit;
use std::{env, fs};

enum Input {
	Stdin,
	File,
}

enum Output {
	Stdout,
	File,
}

fn main() {
	let stdin = get_stdin();
	let args: Vec<String> = env::args().skip(1).collect();
	let (warn, length) = parse_input(&args);
	let (input, output) = match (&stdin, length) {
		(Some(_), 0) => (Input::Stdin, Output::Stdout),
		(Some(_), 1) => (Input::Stdin, Output::File),
		(None, 2) => (Input::File, Output::File),
		(None, 1) => (Input::File, Output::Stdout),
		(Some(_), 2..) | (None, 3..) => {
			print_error("Too many arguments provided!", ErrColor::Red);
			exit(1);
		}
		(None, 0) => {
			print_error("Not enough arguments and no stdin found!", ErrColor::Red);
			exit(1);
		}
	};
	let md = match input {
		Input::Stdin => stdin.unwrap(),
		Input::File => {
			let filename = match output {
				Output::Stdout => &args[args.len() - 1],
				Output::File => &args[args.len() - 2],
			};
			if !filename.ends_with(".md") {
				print_error("Input file must be Markdown.", ErrColor::Red);
				exit(1);
			};
			let filepath = Utf8Path::new(filename);
			if Utf8Path::exists(filepath) {
				fs::read_to_string(filepath).unwrap()
			} else {
				print_error("File not found!", ErrColor::Red);
				exit(1);
			}
		}
	};
	let bbcode = parse(md, &warn);
	match output {
		Output::Stdout => println!("{bbcode}"),
		Output::File => {
			let filename = &args[args.len() - 1];
			let filepath = Utf8Path::new(&filename);
			if !Utf8Path::exists(filepath) {
				fs::write(filepath, bbcode).unwrap()
			} else {
				print_error("File already exists!", ErrColor::Red);
				exit(1);
			}
		}
	}
}

fn parse_input(args: &[String]) -> (WarningType, usize) {
	if args.is_empty() {
		return (WarningType::Warn, 0);
	}
	match args[0].as_str() {
		"-w" | "--warn" => (WarningType::Warn, args[1..].len()),
		"-f" | "--fail" => (WarningType::Fail, args[1..].len()),
		"-q" | "--quiet" => (WarningType::Quiet, args[1..].len()),
		"-h" | "--help" => {
			print_help();
			exit(0);
		}
		"-v" | "--version" => {
			println!("{} {}", env!("CARGO_BIN_NAME"), env!("CARGO_PKG_VERSION"));
			exit(0);
		}
		_ => {
			if args[0].starts_with("-") {
				print_error("Incorrect argument option!", ErrColor::Red);
				print_help();
				exit(1);
			} else {
				(WarningType::Warn, args.len())
			}
		}
	}
}

fn print_help() {
	printdoc! {"
		{} {}

		{}

		Usage Examples:
		  fimdoc input.md output.txt
		  fimdoc -q input.md | bbcode
		  md | fimdoc | bbcode
		  md | fimdoc --fail output.txt

		Options:
		  -w, --warn         Warns on unsupported markdown syntax
		  -f, --fail         Fails on unsupported markdown syntax
		  -q, --quiet        Skips over unsupported markdown syntax
		  -h, --help         Print help
		  -v, --version      Print version\n",
		env!("CARGO_PKG_NAME"),
		env!("CARGO_PKG_VERSION"),
		env!("CARGO_PKG_DESCRIPTION")
	}
}