1use grib_template_derive::{Dump, TryFromSlice, WriteToBuffer};
4
5#[derive(Debug, PartialEq, TryFromSlice, Dump)]
6pub struct Section<T>
7where
8 T: PartialEq + grib_template_helpers::TryFromSlice + grib_template_helpers::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
22pub type Section1 = Section<Section1Payload>;
24
25#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
26pub struct Section1Payload {
27 pub centre_id: u16,
30 pub subcentre_id: u16,
33 pub master_table_version: u8,
35 pub local_table_version: u8,
38 pub ref_time_significance: u8,
40 pub ref_time: RefTime,
42 pub prod_status: u8,
45 pub data_type: u8,
47 pub optional: Option<Section1PayloadOptional>,
48}
49
50#[derive(Debug, PartialEq, Eq, TryFromSlice, WriteToBuffer, Dump)]
51pub struct RefTime {
52 pub year: u16,
54 pub month: u8,
56 pub day: u8,
58 pub hour: u8,
60 pub minute: u8,
62 pub second: u8,
64}
65
66#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
67pub struct Section1PayloadOptional {
68 pub template_num: u16,
70 #[grib_template(variant = "template_num")]
73 pub template: IdentificationTemplate,
74}
75
76#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
77#[repr(u16)]
78pub enum IdentificationTemplate {
79 _1_0(template1::Template1_0) = 0,
80 _1_1(template1::Template1_1) = 1,
81 _1_2(template1::Template1_2) = 2,
82}
83
84pub type Section3 = Section<Section3Payload>;
86
87#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
88pub struct Section3Payload {
89 pub grid_def_source: u8,
91 pub num_points: u32,
93 pub num_point_list_octets: u8,
95 pub point_list_interpretation: u8,
97 pub template_num: u16,
99 #[grib_template(variant = "template_num")]
102 pub template: GridDefinitionTemplate,
103}
104
105#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
106#[repr(u16)]
107pub enum GridDefinitionTemplate {
108 _3_0(template3::Template3_0) = 0,
109 _3_1(template3::Template3_1) = 1,
110 _3_20(template3::Template3_20) = 20,
111 _3_30(template3::Template3_30) = 30,
112 _3_40(template3::Template3_40) = 40,
113 _3_101(template3::Template3_101) = 101,
114}
115
116pub type Section4 = Section<Section4Payload>;
118
119#[derive(Debug, PartialEq, TryFromSlice, Dump)]
120pub struct Section4Payload {
121 pub num_coord_values: u16,
124 pub template_num: u16,
126}
127
128pub type Section5 = Section<Section5Payload>;
130
131#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
132pub struct Section5Payload {
133 pub num_encoded_points: u32,
137 pub template_num: u16,
139 #[grib_template(variant = "template_num")]
142 pub template: DataRepresentationTemplate,
143}
144
145#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
146#[repr(u16)]
147pub enum DataRepresentationTemplate {
148 _5_0(template5::Template5_0) = 0,
149 _5_1(template5::Template5_1) = 1,
150 _5_2(template5::Template5_2) = 2,
151 _5_3(template5::Template5_3) = 3,
152 _5_4(template5::Template5_4) = 4,
153 _5_40(template5::Template5_40) = 40,
154 _5_41(template5::Template5_41) = 41,
155 _5_42(template5::Template5_42) = 42,
156 _5_50(template5::Template5_50) = 50,
157 _5_51(template5::Template5_51) = 51,
158 _5_53(template5::Template5_53) = 53,
159 _5_61(template5::Template5_61) = 61,
160 _5_200(template5::Template5_200) = 200,
161}
162
163pub type Section6 = Section<Section6Payload>;
165
166#[derive(Debug, PartialEq, TryFromSlice, Dump)]
167pub struct Section6Payload {
168 pub bitmap_indicator: u8,
170}
171
172pub mod template {
173 pub use super::{template1::*, template3::*, template5::*};
176
177 pub mod param_set {
178 pub use super::super::{template3::param_set::*, template5::param_set::*};
181 }
182}
183
184mod template1;
185mod template3;
186mod template5;