typsy 0.1.0

Heterogenous containers
Documentation
use std::{
    fmt::{Display, Formatter},
    fs::File,
    io::Write,
    path::Path,
};

type Result<T = (), E = Box<dyn std::error::Error>> = std::result::Result<T, E>;

const MAX_TUPLE_SIZE: u32 = {
    #[cfg(not(feature = "bigger_tuples"))]
    {
        16
    }
    #[cfg(all(not(feature = "extreme_tuples"), feature = "bigger_tuples"))]
    {
        32
    }
    #[cfg(feature = "extreme_tuples")]
    {
        128
    }
};

fn main() -> Result {
    let out_dir = std::env::var_os("OUT_DIR").ok_or("OUT_DIR env var not set")?;
    let out_dir = Path::new(&out_dir);

    let convert_tuple = File::create(out_dir.join("convert_tuple.rs"))?;
    build_convert_tuple(&convert_tuple)?;

    Ok(())
}

struct Vars {
    name: char,
    prefix: &'static dyn Display,
    postfix: &'static dyn Display,
    count: u32,
}

impl Display for Vars {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        for i in 1..=self.count {
            write!(f, "{}{}{}{}", self.prefix, self.name, i, self.postfix)?;
        }

        Ok(())
    }
}

fn build_convert_tuple(mut out: &File) -> Result {
    for i in 0..=MAX_TUPLE_SIZE {
        write!(
            out,
            "
            impl<{type_vars}> Convert for ({type_vars}) {{
                type HList = crate::HList!({type_vars});

                fn into_hlist(self) -> Self::HList {{ let ({vars}) = self; crate::hlist!({vars}) }}
                fn from_hlist(crate::hlist_pat!({vars}): Self::HList) -> Self {{ ({vars}) }}
            }}
            ",
            type_vars = Vars {
                count: i,
                name: 'A',
                prefix: &"",
                postfix: &",",
            },
            vars = Vars {
                count: i,
                name: 'a',
                prefix: &"",
                postfix: &",",
            },
        )?
    }
    Ok(())
}