url_parser_on_rust 1.0.0

url parser on rust
Documentation
use clap::{App, Arg, SubCommand};
use std::fs::File;
use std::io::{self, Read};
use std::process;
use thiserror::Error;
use url_parser_on_rust::{parse_url, ParseUrlError};

#[derive(Debug, Error)]
enum AppError {
    #[error("IO error: {0}")]
    IoError(#[from] io::Error),
    #[error("URL parsing error: {0}")]
    UrlParsingError(#[from] ParseUrlError),
    #[error("Invalid subcommand. Use '--help' for more information.")]
    InvalidSubcommand,
}

impl From<&str> for AppError {
    fn from(s: &str) -> Self {
        AppError::UrlParsingError(ParseUrlError::ParsingError(s.to_string()))
    }
}

fn main() {
    if let Err(err) = run() {
        eprintln!("Error: {}", err);
        process::exit(1);
    }
}

fn run() -> Result<(), AppError> {
    let matches = App::new("URL Parser")
        .version("0.1.4")
        .author("Nazar Pashchuk(nazar.pashchuk@ukma.edu.ua)")
        .about("Parse URLs from a file or command-line input")
        .subcommand(
            SubCommand::with_name("parse")
                .about("Parse a URL")
                .arg(Arg::with_name("input").help("The URL or File path to parse")),
        )
        .subcommand(SubCommand::with_name("help").about("Print help information"))
        .subcommand(SubCommand::with_name("credits").about("Pring credit information"))
        .get_matches();

    match matches.subcommand() {
        ("parse", Some(parse_matches)) => {
            if let Some(input) = parse_matches.value_of("input") {
                if let Ok(url) = File::open(input) {
                    let mut content = String::new();
                    url.take(1024).read_to_string(&mut content)?;
                    let parsed_url = parse_url(&content)?;
                    println!("{:#?}", parsed_url);
                } else {
                    let parsed_url = parse_url(input)?;
                    println!("{:#?}", parsed_url);
                }
            } else {
                return Err(AppError::InvalidSubcommand);
            }
        }
        ("credits", _) => {
            println!("Credits: Nazar Pashchuk(mail: nazar.pashchuk@ukma.edu.ua; github: https://github.com/jester69m)");
        }
        ("help", _) => {
            println!("URL Parser CLI - Help Information\n");
            println!("1. Parse a URL from a String:\n");
            println!("```bash");
            println!("cargo run -- parse http://example.com");
            println!("```");
            println!("Replace `http://example.com` with the URL you want to parse.\n");
            println!("2. Parse a URL from a File:\n");
            println!("```bash");
            println!("cargo run -- parse path/to/your/file.txt");
            println!("```");
            println!("Ensure that the file at the specified path contains a valid URL.\n");
            println!("3. Help Information:\n");
            println!("```bash");
            println!("cargo run -- help");
            println!("```");
            println!("Prints information about how to use the URL Parser CLI.\n");
            println!("4. Credits Information:\n");
            println!("```bash");
            println!("cargo run -- credits");
            println!("```");
            println!("Prints credits information for the URL Parser CLI.");
        }
        _ => {
            return Err(AppError::InvalidSubcommand);
        }
    }

    Ok(())
}