pak_db/
group.rs

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