1use std::collections::HashSet;
2use serde::{Deserialize};
3use crate::{error::PakResult, pointer::PakPointer, Pak};
4
5pub trait DeserializeGroup {
10 type ReturnType;
11
12 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType>;
13
14 fn get_types() -> Vec<&'static str>;
15}
16
17impl <T> DeserializeGroup for (T, ) where T : for<'de> Deserialize<'de> {
18 type ReturnType = Vec<T>;
19
20 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
21 Ok(pointers.iter().filter_map(|pointer| pak.read::<T>(pointer)).collect::<Vec<_>>())
22 }
23
24 fn get_types() -> Vec<&'static str> {
25 vec![
26 std::any::type_name::<T>()
27 ]
28 }
29}
30
31macro_rules! impl_group {
32 ( $( $name:ident )+ ) => {
33 impl <$($name,)+> DeserializeGroup for ($($name, )+ ) where $($name : for<'de> Deserialize<'de>, )+ {
34 type ReturnType = ($(Vec<$name>, )+);
35
36 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
37 Ok(($(pointers.iter().filter_map(|pointer| pak.read::<$name>(pointer)).collect::<Vec<_>>(),)+))
38 }
39
40 fn get_types() -> Vec<&'static str> {
41 vec![$(std::any::type_name::<$name>(), )+]
42 }
43 }
44 };
45}
46
47impl_group!{ A B }
48impl_group!{ A B C }
49impl_group!{ A B C D }
50impl_group!{ A B C D E }
51impl_group!{ A B C D E F }
52impl_group!{ A B C D E F G }
53impl_group!{ A B C D E F G H }
54impl_group!{ A B C D E F G H I }
55impl_group!{ A B C D E F G H I J }
56impl_group!{ A B C D E F G H I J K }