Skip to main content

nx_archive/formats/cnmt/
extended_header.rs

1
2//! Defines the extended header structures for Content Meta (CNMT) files in Nintendo Switch formats.
3//!
4//! This module contains the various extended header types that can be found in CNMT files,
5//! which provide additional metadata depending on the content type. Each content meta type
6//! (Application, Patch, AddOn, etc.) has its own extended header format with specific fields
7//! relevant to that content type.
8//!
9//! The `ExtendedHeader` enum allows for handling different header types through a common interface,
10//! while the specific structs provide type-safe access to the metadata fields appropriate for
11//! each content category.
12use binrw::prelude::*;
13
14/// Extended header variants based on content meta type
15#[derive(Debug, Clone)]
16pub enum ExtendedHeader {
17    Application(ApplicationMetaExtendedHeader),
18    Patch(PatchMetaExtendedHeader),
19    Addon(AddonContentMetaExtendedHeader),
20    Delta(DeltaMetaExtendedHeader),
21    SystemUpdate(SystemUpdateMetaExtendedHeader),
22    DataPatch(DataPatchMetaExtendedHeader),
23    Unknown(Vec<u8>),
24}
25
26/// Extended header for System Update type
27#[binrw]
28#[brw(little)]
29#[derive(Debug, Clone)]
30pub struct SystemUpdateMetaExtendedHeader {
31    /// Data size
32    pub extended_data_size: u32,
33}
34
35/// Extended header for Application type
36#[binrw]
37#[brw(little)]
38#[derive(Debug, Clone)]
39pub struct ApplicationMetaExtendedHeader {
40    /// Patch ID
41    pub patch_id: u64,
42    /// Minimum system version required
43    pub required_system_version: u32,
44    /// Required application version
45    pub required_application_version: u32,
46}
47
48/// Extended header for Patch type
49#[binrw]
50#[brw(little)]
51#[derive(Debug, Clone)]
52pub struct PatchMetaExtendedHeader {
53    /// Application ID
54    pub application_id: u64,
55    /// Minimum system version required
56    pub required_system_version: u32,
57    /// extended data size
58    pub extended_data_size: u32,
59    /// Reserved
60    pub _reserved: u64,
61}
62
63/// Extended header for AddOn type
64#[binrw]
65#[brw(little)]
66#[derive(Debug, Clone)]
67pub struct AddonContentMetaExtendedHeader {
68    /// Application ID
69    pub application_id: u64,
70    /// Minimum application version required
71    pub required_application_version: u32,
72    /// [15.0.0+] Content accessibilities
73    pub content_accessibilities: u8,
74    /// Reserved
75    pub _reserved: [u8; 3],
76    /// Data patch ID
77    pub data_patch_id: u64,
78}
79
80/// Extended header for Delta type
81#[binrw]
82#[brw(little)]
83#[derive(Debug, Clone)]
84pub struct DeltaMetaExtendedHeader {
85    /// Application ID
86    pub application_id: u64,
87    /// Extended data size
88    pub extended_data_size: u32,
89    /// Reserved
90    pub _reserved: u32,
91}
92
93#[binrw]
94#[brw(little)]
95#[derive(Debug, Clone)]
96pub struct DataPatchMetaExtendedHeader {
97    /// Application ID
98    pub application_id: u64,
99    /// Minimum system version required
100    pub required_application_version: u32,
101    pub extended_data_size: u32,
102    pub _reserved: u64,
103}