cotis_defaults/render_commands/
render_t_list.rs1mod private {
19 pub trait Sealed {}
20 impl Sealed for () {}
21 impl<T, L: Sealed + super::IsRenderList> Sealed for super::RenderTList<T, L> {}
22}
23
24pub trait IsRenderList: private::Sealed {}
26impl IsRenderList for () {}
27impl<T, L: IsRenderList> IsRenderList for RenderTList<T, L> {}
28
29#[derive(Clone, Debug)]
30#[cfg_attr(
31 feature = "serialization",
32 derive(serde::Serialize, serde::Deserialize)
33)]
34#[cfg_attr(
35 feature = "serialization",
36 serde(bound(deserialize = "
37 T: serde::de::DeserializeOwned,
38 L: serde::de::DeserializeOwned,
39"))
40)]
41pub enum RenderTList<T, L: IsRenderList> {
42 Type(T),
44 List(L),
46}
47
48pub struct Here;
50pub struct There<Idx>(std::marker::PhantomData<Idx>);
52
53pub trait Embed<Target, Idx> {
55 fn embed(self) -> Target;
57}
58
59impl<T, L: IsRenderList> Embed<RenderTList<T, L>, Here> for RenderTList<T, L> {
61 fn embed(self) -> RenderTList<T, L> {
62 self
63 }
64}
65
66impl<H, TailTarget, Source, Idx> Embed<RenderTList<H, TailTarget>, There<Idx>> for Source
68where
69 TailTarget: IsRenderList,
70 Source: Embed<TailTarget, Idx>,
71{
72 fn embed(self) -> RenderTList<H, TailTarget> {
73 RenderTList::List(self.embed())
74 }
75}
76
77#[cfg(test)]
78mod test {
79 use crate::render_commands::render_t_list::{Embed, Here, RenderTList, There};
80
81 type Full = RenderTList<i32, RenderTList<i32, ()>>;
82
83 #[test]
84 fn embeds_sublist_at_tail_position() {
85 let sub = RenderTList::Type(42);
86 let full = Embed::<Full, There<Here>>::embed(sub);
87
88 match full {
89 RenderTList::List(RenderTList::Type(42)) => {}
90 other => panic!("unexpected embed result: {other:?}"),
91 }
92 }
93}