#![doc = include_str!("README.md")]
#[doc(hidden)]
pub use sumtype_macro::_sumtrait_internal;
pub use sumtype_macro::sumtrait;
pub use sumtype_macro::sumtype;
#[doc(hidden)]
pub trait TypeRef<const RANDOM: usize, const N: usize> {
type Type: ?Sized;
}
pub mod traits {
use super::sumtrait;
#[doc(hidden)]
#[allow(non_camel_case_types)]
trait __SumTrait_Sealed {}
macro_rules! emit_traits {
() => {
#[doc(hidden)]
pub struct Marker(::core::convert::Infallible);
#[sumtrait(implement = ::std::io::Read, krate = $crate, marker = $crate::traits::Marker)]
#[allow(private_bounds)]
pub trait Read {
fn read(&mut self, buf: &mut [::core::primitive::u8]) -> ::std::io::Result<::core::primitive::usize>;
}
impl<T: ::std::io::Read> Read for T {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
T::read(self, buf)
}
}
#[sumtrait(implement = ::core::iter::Iterator, krate = $crate, marker = $crate::traits::Marker)]
#[allow(private_bounds)]
pub trait Iterator {
type Item;
fn next(&mut self) -> ::core::option::Option<Self::Item>;
}
impl<T: ::core::iter::Iterator> Iterator for T {
type Item = T::Item;
fn next(&mut self) -> Option<Self::Item> {
T::next(self)
}
}
#[sumtrait(implement = ::core::marker::Copy, krate = $crate, marker = $crate::traits::Marker)]
#[allow(private_bounds)]
pub trait Copy: $crate::traits::Clone {
}
impl<T: ::core::marker::Copy> Copy for T {}
#[sumtrait(implement = ::core::clone::Clone, krate = $crate, marker = $crate::traits::Marker)]
#[allow(private_bounds)]
pub trait Clone {
fn clone(&self) -> Self;
}
impl<T: ::core::clone::Clone> Clone for T {
fn clone(&self) -> Self {
T::clone(self)
}
}
#[sumtrait(implement = ::core::fmt::Display, krate = $crate, marker = $crate::traits::Marker)]
#[allow(private_bounds)]
pub trait Display {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result;
}
impl<T: ::core::fmt::Display> Display for T {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
T::fmt(self, f)
}
}
#[sumtrait(implement = ::core::fmt::Debug, krate = $crate, marker = $crate::traits::Marker)]
#[allow(private_bounds)]
pub trait Debug {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result;
}
impl<T: ::core::fmt::Debug> Debug for T {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
T::fmt(self, f)
}
}
#[sumtrait(implement = ::std::error::Error, krate = $crate, marker = $crate::traits::Marker)]
#[allow(private_bounds)]
pub trait Error: $crate::traits::Debug + $crate::traits::Display {
fn source(&self) -> ::core::option::Option<&(dyn ::std::error::Error + 'static)>;
}
impl<T: ::std::error::Error> Error for T {
fn source(&self) -> ::core::option::Option<&(dyn ::std::error::Error + 'static)> {
T::source(self)
}
}
};
}
emit_traits!();
}