arsc/writer/
with_header.rs

1use super::components_sizing::ByteSizing;
2use crate::components::{Arsc, Config, Header, Package, ResourceType, Specs, StringPool};
3
4/// A trait for objects that are chunks (with header).
5/// It handles the header generation with predefined information
6pub(in crate::writer) trait WithHeader: ByteSizing {
7    /// The `header_size` attribute in generated header object
8    fn get_header_size(&self) -> u16;
9    /// The `resource_type` attribute in generated header object
10    const RESOURCE_TYPE: ResourceType;
11
12    /// Generate a header
13    fn header(&self) -> Header {
14        Header {
15            resource_type: Self::RESOURCE_TYPE,
16            header_size: self.get_header_size(),
17            size: self.size() as u64,
18        }
19    }
20}
21
22impl WithHeader for Arsc {
23    fn get_header_size(&self) -> u16 {
24        0x000C
25    }
26    const RESOURCE_TYPE: ResourceType = ResourceType::Table;
27}
28
29impl WithHeader for StringPool {
30    fn get_header_size(&self) -> u16 {
31        0x001C
32    }
33    const RESOURCE_TYPE: ResourceType = ResourceType::StringPool;
34}
35
36impl WithHeader for Package {
37    fn get_header_size(&self) -> u16 {
38        0x0120
39    }
40    const RESOURCE_TYPE: ResourceType = ResourceType::TablePackage;
41}
42
43impl WithHeader for Specs {
44    fn get_header_size(&self) -> u16 {
45        self.header_size
46    }
47    const RESOURCE_TYPE: ResourceType = ResourceType::TableTypeSpec;
48}
49
50impl WithHeader for Config {
51    fn get_header_size(&self) -> u16 {
52        self.header_size
53    }
54
55    const RESOURCE_TYPE: ResourceType = ResourceType::TableType;
56}