pub struct Start(());
pub struct NonRefStart(());
pub struct SchemeEnd(());
pub struct AuthorityStart(());
pub struct UserinfoEnd(());
pub struct HostEnd(());
pub struct PortEnd(());
pub struct AuthorityEnd(());
pub struct PathEnd(());
pub struct QueryEnd(());
pub struct FragmentEnd(());
pub struct End(());
pub trait To<T> {}
pub trait AdvanceTo<T>: To<T> {}
macro_rules! impl_many {
($trait:ident for $($x:ty => $($y:ty),+)*) => {
$($(
impl $trait<$y> for $x {}
)+)*
};
}
impl_many! { To for
Start => SchemeEnd, AuthorityStart, PathEnd
NonRefStart => SchemeEnd
SchemeEnd => AuthorityStart, PathEnd
AuthorityStart => UserinfoEnd, HostEnd
UserinfoEnd => HostEnd
HostEnd => PortEnd, AuthorityEnd
PortEnd => AuthorityEnd
AuthorityEnd => PathEnd
PathEnd => QueryEnd, FragmentEnd, End
QueryEnd => FragmentEnd, End
FragmentEnd => End
}
impl<S: To<AuthorityStart>> To<AuthorityEnd> for S {}
impl_many! { AdvanceTo for
Start => SchemeEnd, AuthorityEnd
SchemeEnd => AuthorityEnd
AuthorityStart => UserinfoEnd
HostEnd => PortEnd
PathEnd => QueryEnd, FragmentEnd
QueryEnd => FragmentEnd
}