iref 4.0.0

Uniform & Internationalized Resource Identifiers (URIs/IRIs), borrowed and owned.
Documentation
use super::{
	InvalidAuthority, InvalidFragment, InvalidHost, InvalidPath, InvalidPort, InvalidQuery,
	InvalidScheme, InvalidSegment, InvalidUri, InvalidUriRef, InvalidUserInfo,
};

macro_rules! uri_error {
	($($(#[$meta:meta])* $variant:ident : $ident:ident),*) => {
		#[derive(Debug, thiserror::Error)]
		pub enum UriError<T> {
			$(
				$(#[$meta])*
				$variant(#[from] $ident<T>)
			),*
		}

		$(
		    #[cfg(feature = "std")]
			impl<'a> From<$ident<String>> for UriError<std::borrow::Cow<'a, str>> {
				fn from($ident(value): $ident<String>) -> Self {
					Self::$variant($ident(std::borrow::Cow::Owned(value)))
				}
			}

			#[cfg(feature = "std")]
			impl<'a> From<$ident<&'a str>> for UriError<std::borrow::Cow<'a, str>> {
				fn from($ident(value): $ident<&'a str>) -> Self {
					Self::$variant($ident(std::borrow::Cow::Borrowed(value)))
				}
			}

			#[cfg(feature = "std")]
			impl<'a> From<$ident<Vec<u8>>> for UriError<std::borrow::Cow<'a, [u8]>> {
				fn from($ident(value): $ident<Vec<u8>>) -> Self {
					Self::$variant($ident(std::borrow::Cow::Owned(value)))
				}
			}

			#[cfg(feature = "std")]
			impl<'a> From<$ident<&'a [u8]>> for UriError<std::borrow::Cow<'a, [u8]>> {
				fn from($ident(value): $ident<&'a [u8]>) -> Self {
					Self::$variant($ident(std::borrow::Cow::Borrowed(value)))
				}
			}
		)*
	};
}

uri_error! {
	#[error("invalid URI: {0}")]
	Uri: InvalidUri,

	#[error("invalid URI reference: {0}")]
	Reference: InvalidUriRef,

	#[error("invalid URI scheme: {0}")]
	Scheme: InvalidScheme,

	#[error("invalid URI authority: {0}")]
	Authority: InvalidAuthority,

	#[error("invalid URI authority user info: {0}")]
	UserInfo: InvalidUserInfo,

	#[error("invalid URI authority host: {0}")]
	Host: InvalidHost,

	#[error("invalid URI authority port: {0}")]
	Port: InvalidPort,

	#[error("invalid URI path: {0}")]
	Path: InvalidPath,

	#[error("invalid URI path segment: {0}")]
	PathSegment: InvalidSegment,

	#[error("invalid URI query: {0}")]
	Query: InvalidQuery,

	#[error("invalid URI fragment: {0}")]
	Fragment: InvalidFragment
}