1use grib_template_derive::{Dump, TryFromSlice, WriteToBuffer};
4
5#[derive(Debug, PartialEq, TryFromSlice, Dump)]
6pub struct Section<T>
7where
8 T: PartialEq + crate::TryFromSlice + crate::Dump,
9{
10 pub header: SectionHeader,
11 pub payload: T,
12}
13
14#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
15pub struct SectionHeader {
16 pub len: u32,
18 pub sect_num: u8,
20}
21
22#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
24pub struct Section0 {
25 pub identifier: [u8; 4],
27 pub reserved: [u8; 2],
29 pub discipline: u8,
31 pub edition_num: u8,
33 pub total_len: u64,
35}
36
37pub type Section1 = Section<Section1Payload>;
39
40#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
41pub struct Section1Payload {
42 pub centre_id: u16,
45 pub subcentre_id: u16,
48 pub master_table_version: u8,
50 pub local_table_version: u8,
53 pub ref_time_significance: u8,
55 pub ref_time: RefTime,
57 pub prod_status: u8,
60 pub data_type: u8,
62 pub optional: Option<Section1PayloadOptional>,
63}
64
65#[derive(Debug, PartialEq, Eq, TryFromSlice, WriteToBuffer, Dump)]
66pub struct RefTime {
67 pub year: u16,
69 pub month: u8,
71 pub day: u8,
73 pub hour: u8,
75 pub minute: u8,
77 pub second: u8,
79}
80
81#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
82pub struct Section1PayloadOptional {
83 pub template_num: u16,
85 #[grib_template(variant = "template_num")]
88 pub template: IdentificationTemplate,
89}
90
91#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
92#[non_exhaustive]
93#[repr(u16)]
94pub enum IdentificationTemplate {
95 _1_0(template1::Template1_0) = 0,
96 _1_1(template1::Template1_1) = 1,
97 _1_2(template1::Template1_2) = 2,
98}
99
100pub type Section3 = Section<Section3Payload>;
102
103#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
104pub struct Section3Payload {
105 pub grid_def_source: u8,
107 pub num_points: u32,
109 pub num_point_list_octets: u8,
111 pub point_list_interpretation: u8,
113 pub template_num: u16,
115 #[grib_template(variant = "template_num")]
118 pub template: GridDefinitionTemplate,
119}
120
121#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
122#[non_exhaustive]
123#[repr(u16)]
124pub enum GridDefinitionTemplate {
125 _3_0(template3::Template3_0) = 0,
126 _3_1(template3::Template3_1) = 1,
127 _3_20(template3::Template3_20) = 20,
128 _3_30(template3::Template3_30) = 30,
129 _3_40(template3::Template3_40) = 40,
130 _3_101(template3::Template3_101) = 101,
131}
132
133pub type Section4 = Section<Section4Payload>;
135
136#[derive(Debug, PartialEq, TryFromSlice, Dump)]
137pub struct Section4Payload {
138 pub num_coord_values: u16,
141 pub template_num: u16,
143}
144
145pub type Section5 = Section<Section5Payload>;
147
148#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
149pub struct Section5Payload {
150 pub num_encoded_points: u32,
154 pub template_num: u16,
156 #[grib_template(variant = "template_num")]
159 pub template: DataRepresentationTemplate,
160}
161
162#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
163#[non_exhaustive]
164#[repr(u16)]
165pub enum DataRepresentationTemplate {
166 _5_0(template5::Template5_0) = 0,
167 _5_1(template5::Template5_1) = 1,
168 _5_2(template5::Template5_2) = 2,
169 _5_3(template5::Template5_3) = 3,
170 _5_4(template5::Template5_4) = 4,
171 _5_40(template5::Template5_40) = 40,
172 _5_41(template5::Template5_41) = 41,
173 _5_42(template5::Template5_42) = 42,
174 _5_50(template5::Template5_50) = 50,
175 _5_51(template5::Template5_51) = 51,
176 _5_53(template5::Template5_53) = 53,
177 _5_61(template5::Template5_61) = 61,
178 _5_200(template5::Template5_200) = 200,
179}
180
181pub type Section6 = Section<Section6Payload>;
183
184#[derive(Debug, PartialEq, TryFromSlice, Dump)]
185pub struct Section6Payload {
186 pub bitmap_indicator: u8,
188}
189
190pub mod template {
191 pub use super::{template1::*, template3::*, template5::*};
194
195 pub mod param_set {
196 pub use super::super::{template3::param_set::*, template5::param_set::*};
199 }
200}
201
202mod template1;
203mod template3;
204mod template5;