use grib_template_derive::{Dump, TryFromSlice, WriteToBuffer};
#[derive(Debug, PartialEq, TryFromSlice, Dump)]
pub struct Section<T>
where
T: PartialEq + grib_template_helpers::TryFromSlice + grib_template_helpers::Dump,
{
pub header: SectionHeader,
pub payload: T,
}
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct SectionHeader {
pub len: u32,
pub sect_num: u8,
}
pub type Section1 = Section<Section1Payload>;
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct Section1Payload {
pub centre_id: u16,
pub subcentre_id: u16,
pub master_table_version: u8,
pub local_table_version: u8,
pub ref_time_significance: u8,
pub ref_time: RefTime,
pub prod_status: u8,
pub data_type: u8,
pub optional: Option<Section1PayloadOptional>,
}
#[derive(Debug, PartialEq, Eq, TryFromSlice, WriteToBuffer, Dump)]
pub struct RefTime {
pub year: u16,
pub month: u8,
pub day: u8,
pub hour: u8,
pub minute: u8,
pub second: u8,
}
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct Section1PayloadOptional {
pub template_num: u16,
#[grib_template(variant = "template_num")]
pub template: IdentificationTemplate,
}
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
#[repr(u16)]
pub enum IdentificationTemplate {
_1_0(template1::Template1_0) = 0,
_1_1(template1::Template1_1) = 1,
_1_2(template1::Template1_2) = 2,
}
pub type Section3 = Section<Section3Payload>;
#[derive(Debug, PartialEq, TryFromSlice, Dump)]
pub struct Section3Payload {
pub grid_def_source: u8,
pub num_points: u32,
pub num_point_list_octets: u8,
pub point_list_interpretation: u8,
pub template_num: u16,
#[grib_template(variant = "template_num")]
pub template: GridDefinitionTemplate,
}
#[derive(Debug, PartialEq, TryFromSlice, Dump)]
#[repr(u16)]
pub enum GridDefinitionTemplate {
_3_0(template3::Template3_0) = 0,
_3_1(template3::Template3_1) = 1,
_3_20(template3::Template3_20) = 20,
_3_30(template3::Template3_30) = 30,
_3_40(template3::Template3_40) = 40,
}
pub type Section4 = Section<Section4Payload>;
#[derive(Debug, PartialEq, TryFromSlice, Dump)]
pub struct Section4Payload {
pub num_coord_values: u16,
pub template_num: u16,
}
pub type Section5 = Section<Section5Payload>;
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct Section5Payload {
pub num_encoded_points: u32,
pub template_num: u16,
#[grib_template(variant = "template_num")]
pub template: DataRepresentationTemplate,
}
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
#[repr(u16)]
pub enum DataRepresentationTemplate {
_5_0(template5::Template5_0) = 0,
_5_1(template5::Template5_1) = 1,
_5_2(template5::Template5_2) = 2,
_5_3(template5::Template5_3) = 3,
_5_4(template5::Template5_4) = 4,
_5_40(template5::Template5_40) = 40,
_5_41(template5::Template5_41) = 41,
_5_42(template5::Template5_42) = 42,
_5_50(template5::Template5_50) = 50,
_5_51(template5::Template5_51) = 51,
_5_53(template5::Template5_53) = 53,
_5_61(template5::Template5_61) = 61,
_5_200(template5::Template5_200) = 200,
}
pub type Section6 = Section<Section6Payload>;
#[derive(Debug, PartialEq, TryFromSlice, Dump)]
pub struct Section6Payload {
pub bitmap_indicator: u8,
}
pub mod template {
pub use super::{template1::*, template3::*, template5::*};
pub mod param_set {
pub use super::super::{template3::param_set::*, template5::param_set::*};
}
}
mod template1;
mod template3;
mod template5;