1use std::collections::HashSet;
2use serde::{de::DeserializeOwned, Serialize};
3use crate::{error::PakResult, pointer::PakPointer, Pak};
4use super::index::PakIndex;
5
6pub trait PakItemSearchable {
11 fn get_indices(&self) -> Vec<PakIndex>;
12}
13
14pub trait PakItemSerialize {
15 fn into_bytes(&self) -> PakResult<Vec<u8>>;
16}
17
18pub trait PakItemDeserialize: Sized {
19 fn from_bytes(bytes: &[u8]) -> PakResult<Self>;
20
21 fn from_pak(pak : &[u8], pointer : &PakPointer) -> PakResult<Self> {
22 let data = &pak[pointer.offset() as usize..pointer.offset() as usize + pointer.size() as usize];
23 let res = Self::from_bytes(data)?;
24 Ok(res)
25 }
26}
27
28impl <T> PakItemDeserialize for T where T : DeserializeOwned {
29 fn from_bytes(bytes: &[u8]) -> PakResult<Self> {
30 let obj : Self = bincode::deserialize::<Self>(bytes)?;
31 Ok(obj)
32 }
33}
34
35impl <T> PakItemSerialize for T where T : Serialize {
36 fn into_bytes(&self) -> PakResult<Vec<u8>> {
37 bincode::serialize(self).map_err(|e| e.into())
38 }
39}
40
41pub trait PakItemDeserializeGroup {
46 type ReturnType;
47
48 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType>;
49
50 fn get_types() -> Vec<&'static str>;
51}
52
53impl <T> PakItemDeserializeGroup for (T, ) where T : PakItemDeserialize{
54 type ReturnType = Vec<T>;
55
56 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
57 let values = pointers.iter().filter_map(|pointer| pak.read::<T>(pointer)).collect::<Vec<_>>();
58 Ok(values)
59 }
60
61 fn get_types() -> Vec<&'static str> {
62 vec![
63 std::any::type_name::<T>()
64 ]
65 }
66}
67
68impl <T1, T2> PakItemDeserializeGroup for (T1, T2) where T1 : PakItemDeserialize, T2 : PakItemDeserialize {
69 type ReturnType = (Vec<T1>, Vec<T2>);
70
71 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
72 let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
73 let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
74 return Ok((t1, t2));
75 }
76
77 fn get_types() -> Vec<&'static str> {
78 vec![
79 std::any::type_name::<T1>(),
80 std::any::type_name::<T2>(),
81 ]
82 }
83}
84
85impl <T1, T2, T3> PakItemDeserializeGroup for (T1, T2, T3) where T1 : PakItemDeserialize, T2 : PakItemDeserialize, T3 : PakItemDeserialize {
86 type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>);
87
88 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
89 let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
90 let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
91 let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
92 return Ok((t1, t2, t3));
93 }
94
95 fn get_types() -> Vec<&'static str> {
96 vec![
97 std::any::type_name::<T1>(),
98 std::any::type_name::<T2>(),
99 std::any::type_name::<T3>(),
100 ]
101 }
102}
103
104impl <T1, T2, T3, T4> PakItemDeserializeGroup for (T1, T2, T3, T4) where T1 : PakItemDeserialize, T2 : PakItemDeserialize, T3 : PakItemDeserialize, T4 : PakItemDeserialize {
105 type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>, Vec<T4>);
106
107 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
108 let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
109 let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
110 let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
111 let t4 = pointers.iter().filter_map(|pointer| pak.read::<T4>(pointer)).collect::<Vec<_>>();
112 return Ok((t1, t2, t3, t4));
113 }
114
115 fn get_types() -> Vec<&'static str> {
116 vec![
117 std::any::type_name::<T1>(),
118 std::any::type_name::<T2>(),
119 std::any::type_name::<T3>(),
120 std::any::type_name::<T4>(),
121 ]
122 }
123}
124
125impl <T1, T2, T3, T4, T5> PakItemDeserializeGroup for (T1, T2, T3, T4, T5) where T1 : PakItemDeserialize, T2 : PakItemDeserialize, T3 : PakItemDeserialize, T4 : PakItemDeserialize, T5 : PakItemDeserialize {
126 type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>, Vec<T4>, Vec<T5>);
127
128 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
129 let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
130 let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
131 let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
132 let t4 = pointers.iter().filter_map(|pointer| pak.read::<T4>(pointer)).collect::<Vec<_>>();
133 let t5 = pointers.iter().filter_map(|pointer| pak.read::<T5>(pointer)).collect::<Vec<_>>();
134 return Ok((t1, t2, t3, t4, t5));
135 }
136
137 fn get_types() -> Vec<&'static str> {
138 vec![
139 std::any::type_name::<T1>(),
140 std::any::type_name::<T2>(),
141 std::any::type_name::<T3>(),
142 std::any::type_name::<T4>(),
143 std::any::type_name::<T5>(),
144 ]
145 }
146}
147
148impl <T1, T2, T3, T4, T5, T6> PakItemDeserializeGroup for (T1, T2, T3, T4, T5, T6) where T1 : PakItemDeserialize, T2 : PakItemDeserialize, T3 : PakItemDeserialize, T4 : PakItemDeserialize, T5 : PakItemDeserialize, T6 : PakItemDeserialize {
149 type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>, Vec<T4>, Vec<T5>, Vec<T6>);
150
151 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
152 let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
153 let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
154 let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
155 let t4 = pointers.iter().filter_map(|pointer| pak.read::<T4>(pointer)).collect::<Vec<_>>();
156 let t5 = pointers.iter().filter_map(|pointer| pak.read::<T5>(pointer)).collect::<Vec<_>>();
157 let t6 = pointers.iter().filter_map(|pointer| pak.read::<T6>(pointer)).collect::<Vec<_>>();
158 return Ok((t1, t2, t3, t4, t5, t6));
159 }
160
161 fn get_types() -> Vec<&'static str> {
162 vec![
163 std::any::type_name::<T1>(),
164 std::any::type_name::<T2>(),
165 std::any::type_name::<T3>(),
166 std::any::type_name::<T4>(),
167 std::any::type_name::<T5>(),
168 std::any::type_name::<T6>(),
169 ]
170 }
171}
172
173impl <T1, T2, T3, T4, T5, T6, T7> PakItemDeserializeGroup for (T1, T2, T3, T4, T5, T6, T7) where T1 : PakItemDeserialize, T2 : PakItemDeserialize, T3 : PakItemDeserialize, T4 : PakItemDeserialize, T5 : PakItemDeserialize, T6 : PakItemDeserialize, T7 : PakItemDeserialize {
174 type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>, Vec<T4>, Vec<T5>, Vec<T6>, Vec<T7>);
175
176 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
177 let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
178 let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
179 let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
180 let t4 = pointers.iter().filter_map(|pointer| pak.read::<T4>(pointer)).collect::<Vec<_>>();
181 let t5 = pointers.iter().filter_map(|pointer| pak.read::<T5>(pointer)).collect::<Vec<_>>();
182 let t6 = pointers.iter().filter_map(|pointer| pak.read::<T6>(pointer)).collect::<Vec<_>>();
183 let t7 = pointers.iter().filter_map(|pointer| pak.read::<T7>(pointer)).collect::<Vec<_>>();
184 return Ok((t1, t2, t3, t4, t5, t6, t7));
185 }
186
187 fn get_types() -> Vec<&'static str> {
188 vec![
189 std::any::type_name::<T1>(),
190 std::any::type_name::<T2>(),
191 std::any::type_name::<T3>(),
192 std::any::type_name::<T4>(),
193 std::any::type_name::<T5>(),
194 std::any::type_name::<T6>(),
195 std::any::type_name::<T7>(),
196 ]
197 }
198}
199
200impl <T1, T2, T3, T4, T5, T6, T7, T8> PakItemDeserializeGroup for (T1, T2, T3, T4, T5, T6, T7, T8) where T1 : PakItemDeserialize, T2 : PakItemDeserialize, T3 : PakItemDeserialize, T4 : PakItemDeserialize, T5 : PakItemDeserialize, T6 : PakItemDeserialize, T7 : PakItemDeserialize, T8 : PakItemDeserialize {
201 type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>, Vec<T4>, Vec<T5>, Vec<T6>, Vec<T7>, Vec<T8>);
202
203 fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
204 let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
205 let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
206 let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
207 let t4 = pointers.iter().filter_map(|pointer| pak.read::<T4>(pointer)).collect::<Vec<_>>();
208 let t5 = pointers.iter().filter_map(|pointer| pak.read::<T5>(pointer)).collect::<Vec<_>>();
209 let t6 = pointers.iter().filter_map(|pointer| pak.read::<T6>(pointer)).collect::<Vec<_>>();
210 let t7 = pointers.iter().filter_map(|pointer| pak.read::<T7>(pointer)).collect::<Vec<_>>();
211 let t8 = pointers.iter().filter_map(|pointer| pak.read::<T8>(pointer)).collect::<Vec<_>>();
212 return Ok((t1, t2, t3, t4, t5, t6, t7, t8));
213 }
214
215 fn get_types() -> Vec<&'static str> {
216 vec![
217 std::any::type_name::<T1>(),
218 std::any::type_name::<T2>(),
219 std::any::type_name::<T3>(),
220 std::any::type_name::<T4>(),
221 std::any::type_name::<T5>(),
222 std::any::type_name::<T6>(),
223 std::any::type_name::<T7>(),
224 std::any::type_name::<T8>(),
225 ]
226 }
227}