pak_db/
group.rs

1use std::collections::HashSet;
2use serde::{Deserialize};
3use crate::{error::PakResult, pointer::PakPointer, Pak};
4
5//==============================================================================================
6//        PakItemDeserialzedGroup
7//==============================================================================================
8
9pub 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 }