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
51impl <T> PakItemDeserializeGroup for (T, ) where T : PakItemDeserialize{
52    type ReturnType = Vec<T>;
53    
54    fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
55        let values = pointers.iter().filter_map(|pointer| pak.read::<T>(pointer)).collect::<Vec<_>>();
56        Ok(values)
57    }
58}
59
60impl <T1, T2> PakItemDeserializeGroup for (T1, T2) where T1 : PakItemDeserialize, T2 : PakItemDeserialize {
61    type ReturnType = (Vec<T1>, Vec<T2>);
62
63    fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
64        let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
65        let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
66        return Ok((t1, t2));
67    }
68}
69
70impl <T1, T2, T3> PakItemDeserializeGroup for (T1, T2, T3) where T1 : PakItemDeserialize, T2 : PakItemDeserialize, T3 : PakItemDeserialize {
71    type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>);
72
73    fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
74        let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
75        let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
76        let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
77        return Ok((t1, t2, t3));
78    }
79}
80
81impl <T1, T2, T3, T4> PakItemDeserializeGroup for (T1, T2, T3, T4) where T1 : PakItemDeserialize, T2 : PakItemDeserialize, T3 : PakItemDeserialize, T4 : PakItemDeserialize {
82    type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>, Vec<T4>);
83
84    fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
85        let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
86        let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
87        let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
88        let t4 = pointers.iter().filter_map(|pointer| pak.read::<T4>(pointer)).collect::<Vec<_>>();
89        return Ok((t1, t2, t3, t4));
90    }
91}
92
93impl <T1, T2, T3, T4, T5> PakItemDeserializeGroup for (T1, T2, T3, T4, T5) where T1 : PakItemDeserialize, T2 : PakItemDeserialize, T3 : PakItemDeserialize, T4 : PakItemDeserialize, T5 : PakItemDeserialize {
94    type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>, Vec<T4>, Vec<T5>);
95
96    fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
97        let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
98        let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
99        let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
100        let t4 = pointers.iter().filter_map(|pointer| pak.read::<T4>(pointer)).collect::<Vec<_>>();
101        let t5 = pointers.iter().filter_map(|pointer| pak.read::<T5>(pointer)).collect::<Vec<_>>();
102        return Ok((t1, t2, t3, t4, t5));
103    }
104}
105
106impl <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 {
107    type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>, Vec<T4>, Vec<T5>, Vec<T6>);
108
109    fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
110        let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
111        let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
112        let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
113        let t4 = pointers.iter().filter_map(|pointer| pak.read::<T4>(pointer)).collect::<Vec<_>>();
114        let t5 = pointers.iter().filter_map(|pointer| pak.read::<T5>(pointer)).collect::<Vec<_>>();
115        let t6 = pointers.iter().filter_map(|pointer| pak.read::<T6>(pointer)).collect::<Vec<_>>();
116        return Ok((t1, t2, t3, t4, t5, t6));
117    }
118}
119
120impl <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 {
121    type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>, Vec<T4>, Vec<T5>, Vec<T6>, Vec<T7>);
122
123    fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
124        let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
125        let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
126        let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
127        let t4 = pointers.iter().filter_map(|pointer| pak.read::<T4>(pointer)).collect::<Vec<_>>();
128        let t5 = pointers.iter().filter_map(|pointer| pak.read::<T5>(pointer)).collect::<Vec<_>>();
129        let t6 = pointers.iter().filter_map(|pointer| pak.read::<T6>(pointer)).collect::<Vec<_>>();
130        let t7 = pointers.iter().filter_map(|pointer| pak.read::<T7>(pointer)).collect::<Vec<_>>();
131        return Ok((t1, t2, t3, t4, t5, t6, t7));
132    }
133}
134
135impl <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 {
136    type ReturnType = (Vec<T1>, Vec<T2>, Vec<T3>, Vec<T4>, Vec<T5>, Vec<T6>, Vec<T7>, Vec<T8>);
137
138    fn deserialize_group(pak : &Pak, pointers : HashSet<PakPointer>) -> PakResult<Self::ReturnType> {
139        let t1 = pointers.iter().filter_map(|pointer| pak.read::<T1>(pointer)).collect::<Vec<_>>();
140        let t2 = pointers.iter().filter_map(|pointer| pak.read::<T2>(pointer)).collect::<Vec<_>>();
141        let t3 = pointers.iter().filter_map(|pointer| pak.read::<T3>(pointer)).collect::<Vec<_>>();
142        let t4 = pointers.iter().filter_map(|pointer| pak.read::<T4>(pointer)).collect::<Vec<_>>();
143        let t5 = pointers.iter().filter_map(|pointer| pak.read::<T5>(pointer)).collect::<Vec<_>>();
144        let t6 = pointers.iter().filter_map(|pointer| pak.read::<T6>(pointer)).collect::<Vec<_>>();
145        let t7 = pointers.iter().filter_map(|pointer| pak.read::<T7>(pointer)).collect::<Vec<_>>();
146        let t8 = pointers.iter().filter_map(|pointer| pak.read::<T8>(pointer)).collect::<Vec<_>>();
147        return Ok((t1, t2, t3, t4, t5, t6, t7, t8));
148    }
149}