Documentation
macro_rules! write_entry {
    ($out:expr, $key:tt, $val:expr) => {
        {
            $out.write(b"  ")?;
            $key.serialize($out)?;
            $out.write(b" ")?;
            $val.serialize($out)?;
            $out.write(b"\n")?;
        }
    }
}
macro_rules! write_entrys {
    ($out:expr, $key:tt << $val:expr $(,)*) => {
        write_entry!($out, $key, $val);
    };
    ($out:expr, $key:tt << $val:expr, $($rest:tt)*) => {
        {
            write_entry!($out, $key, $val);
            write_entrys!($out, $($rest)*);
        }
    };
    ($out:expr, $key:tt ? << $val:expr $(,)*) => {
        match &$val {
            &Some(ref v) => write_entry!($out, $key, v),
            &None => {}
        }
    };
    ($out:expr, $key:tt ? << $val:expr, $($rest:tt)*) => {
        {
            match &$val {
                &Some(ref v) => write_entry!($out, $key, v),
                &None => {}
            }
            write_entrys!($out, $($rest)*);
        }
    }
}

macro_rules! write_dict {
    ($out:expr, $($rest:tt)*) => {
        {
            write!($out, "<<\n")?;
            write_entrys!($out, $($rest)*);
            write!($out, ">>")?;
        }
    };
}