pak_db/
item.rs

1use std::collections::HashSet;
2use serde::{de::DeserializeOwned, Serialize};
3use crate::{error::PakResult, pointer::PakPointer, Pak};
4use super::index::PakIndex;
5
6//==============================================================================================
7//        PakItem Traits
8//==============================================================================================
9
10pub 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
41//==============================================================================================
42//        PakItemDeserialzedGroup
43//==============================================================================================
44
45pub 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}