1use std::collections::HashSet;
2use serde::{Deserialize};
3use crate::{error::PakResult, pointer::PakPointer, Pak};
4use super::index::PakIndex;
5
6pub trait PakSearchable {
11 fn get_indices(&self) -> Vec<PakIndex>;
12}
13
14pub 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 }