#[cfg(feature = "alloc")]
use alloc::string::String;
#[cfg(feature = "std")]
use std::ffi::{CStr, CString};
#[cfg(feature = "std")]
use std::os::raw::c_char;
#[cfg(feature = "alloc")]
use crate::WriteStringFn;
use crate::{WriteBytesFn, WriteLenPtrFn, WritePtrLenFn, WriteStrFn};
#[cfg(feature = "std")]
use crate::{WriteCCharPtrFn, WriteCStrFn, WriteCStringFn};
pub trait IntoWriteFn<Ts> {
type WriteFn;
fn into_write_fn(self) -> Self::WriteFn;
}
macro_rules! def {
( ($F:tt, $R:tt), $func:ty, ($($ty:ty),*) ) => {
impl<$F, $R> IntoWriteFn<($($ty,)*)> for $F
where
$F: FnMut($($ty),*) -> $R,
{
type WriteFn = $func;
fn into_write_fn(self) -> Self::WriteFn {
Self::WriteFn::new(self)
}
}
}
}
def!((F, R), WritePtrLenFn<F, R>, (*const u8, usize));
def!((F, R), WriteLenPtrFn<F, R>, (usize, *const u8));
def!((F, R), WriteBytesFn<F, R>, (&[u8]));
def!((F, R), WriteStrFn<F, R>, (&str));
#[cfg(feature = "alloc")]
def!((F, R), WriteStringFn<F, R>, (String));
#[cfg(feature = "std")]
def!((F, R), WriteCStrFn<F, R>, (&CStr));
#[cfg(feature = "std")]
def!((F, R), WriteCStringFn<F, R>, (CString));
#[cfg(feature = "std")]
def!((F, R), WriteCCharPtrFn<F, R>, (*const c_char));