use crate::acl::HttpRequestMethod;
use std::net::{IpAddr, SocketAddr};
use std::ops::RangeInclusive;
use thiserror::Error;
#[non_exhaustive]
#[derive(Clone, Debug, Eq, Hash, PartialEq, Error)]
pub enum AddError {
#[error("The HTTP method `{0:?}` is already allowed.")]
AlreadyAllowedMethod(HttpRequestMethod),
#[error("The HTTP method `{0:?}` is already denied.")]
AlreadyDeniedMethod(HttpRequestMethod),
#[error("The host `{0}` is already allowed.")]
AlreadyAllowedHost(String),
#[error("The host `{0}` is already denied.")]
AlreadyDeniedHost(String),
#[error("The port range `{0:?}` is already allowed.")]
AlreadyAllowedPortRange(RangeInclusive<u16>),
#[error("The port range `{0:?}` is already denied.")]
AlreadyDeniedPortRange(RangeInclusive<u16>),
#[error("The IP range `{0:?}` is already allowed.")]
AlreadyAllowedIpRange(RangeInclusive<IpAddr>),
#[error("The IP range `{0:?}` is already denied.")]
AlreadyDeniedIpRange(RangeInclusive<IpAddr>),
#[error(
"The IP range `{0:?}` is not a global IP range, and non-global IP ranges are not allowed."
)]
NonGlobalIpRange(RangeInclusive<IpAddr>),
#[error("The header `{0}` is already allowed.")]
AlreadyAllowedHeader(String, Option<String>),
#[error("The header `{0}` is already denied.")]
AlreadyDeniedHeader(String, Option<String>),
#[error("The URL path `{0}` is already allowed.")]
AlreadyAllowedUrlPath(String),
#[error("The URL path `{0}` is already denied.")]
AlreadyDeniedUrlPath(String),
#[error("The static DNS mapping for `{0}`-`{1}` is already present.")]
AlreadyPresentStaticDnsMapping(String, SocketAddr),
#[error("The entity `{0}` is not allowed or denied because it is invalid.")]
InvalidEntity(String),
#[error("The entity `{0}` is not unique.")]
NotUnique(String),
#[error("The entity `{0}` overlaps with another.")]
Overlaps(String),
#[error("The entity `{0}` is both allowed and denied.")]
BothAllowedAndDenied(String),
#[error("An error occurred: `{0}`")]
Error(String),
}