use std::{io, net::AddrParseError, num::ParseIntError, string::FromUtf8Error};
use thiserror::Error;
use tokio::sync::AcquireError;
use tokio::task::JoinError;
#[derive(Error, Debug)]
pub enum AppError {
#[error("I/O error: {0}")]
Io(#[from] io::Error),
#[error("Network error: {0}")]
Network(#[from] reqwest::Error),
#[error("String conversion error: {0}")]
Utf8(#[from] FromUtf8Error),
#[error("Parse error: {0}")]
ParseError(String),
#[error("Invalid input: {0}")]
InvalidInput(String),
#[error("{0}")]
Other(String),
#[error("Semaphore acquire error: {0}")]
SemaphoreError(#[from] AcquireError),
#[error("Task join error: {0}")]
JoinError(#[from] JoinError),
#[error("Address parse error: {0}")]
AddrParseError(#[from] AddrParseError),
#[error("Integer parse error: {0}")]
ParseIntError(#[from] ParseIntError),
}