use grib_template_derive::{Dump, TryFromSlice, WriteToBuffer};
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct Template4_0 {
pub param: param_set::ProductParam,
pub generating_process: param_set::GeneratingProcess,
#[dump(doc(
cutoff_hours = "Hours of observational data cutoff after reference time (see Note 1)",
cutoff_minutes = "Minutes of observational data cutoff after reference time",
))]
pub forecast_time: param_set::ForecastTime,
pub horizontal: param_set::Horizontal,
}
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct Template4_1 {
pub param: param_set::ProductParam,
#[dump(doc(
process_id = "Forecast generating process identifier (defined by originating centre).",
))]
pub generating_process: param_set::GeneratingProcess,
pub forecast_time: param_set::ForecastTime,
pub horizontal: param_set::Horizontal,
pub emsemble_forecast: param_set::EnsembleForecast,
}
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct Template4_2 {
pub param: param_set::ProductParam,
#[dump(doc(
process_id = "Forecast generating process identifier (defined by originating centre).",
))]
pub generating_process: param_set::GeneratingProcess,
pub forecast_time: param_set::ForecastTime,
pub horizontal: param_set::Horizontal,
pub derived_forecast: param_set::DerivedForecast,
}
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct Template4_5 {
pub param: param_set::ProductParam,
#[dump(doc(
process_id = "Forecast generating process identifier (defined by originating centre).",
))]
pub generating_process: param_set::GeneratingProcess,
pub forecast_time: param_set::ForecastTime,
pub horizontal: param_set::Horizontal,
pub probability_forecasts: param_set::ProbabilityForecasts,
}
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct Template4_6 {
pub param: param_set::ProductParam,
pub generating_process: param_set::GeneratingProcess,
pub forecast_time: param_set::ForecastTime,
pub horizontal: param_set::Horizontal,
pub percentile_forecasts: param_set::PercentileForecasts,
}
pub(crate) mod param_set {
use grib_template_derive::{Dump, TryFromSlice, WriteToBuffer};
use super::super::template::param_set::{ScaledValue, TimeRange};
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct ProductParam {
pub category: u8,
pub num: u8,
}
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct GeneratingProcess {
pub process_type: u8,
pub background_process: u8,
pub process_id: u8,
}
#[derive(Debug, PartialEq, TryFromSlice, WriteToBuffer, Dump)]
pub struct ForecastTime {
pub cutoff_hours: u16,
pub cutoff_minutes: u8,
#[dump(doc(
unit = "Indicator of unit of time range (see Code Table 4.4).",
len = "Forecast time in units defined by octet 18.",
))]
pub time: TimeRange<i32>,
}
#[derive(Debug, PartialEq, Eq, TryFromSlice, WriteToBuffer, Dump)]
pub struct Horizontal {
#[dump(doc(
surface_type = "Type of first fixed surface (see Code Table 4.5).",
value(
scale_factor = "Scale factor of first fixed surface.",
scaled_value = "Scaled value of first fixed surface.",
),
))]
pub first_surface: FixedSurface,
#[dump(doc(
surface_type = "Type of second fixed surface (see Code Table 4.5).",
value(
scale_factor = "Scale factor of second fixed surface.",
scaled_value = "Scaled value of second fixed surface.",
),
))]
pub second_surface: FixedSurface,
}
#[derive(Debug, PartialEq, Eq, TryFromSlice, WriteToBuffer, Dump)]
pub struct FixedSurface {
pub surface_type: u8,
pub value: ScaledValue<i8, i32>,
}
#[derive(Debug, PartialEq, Eq, TryFromSlice, WriteToBuffer, Dump)]
pub struct EnsembleForecast {
pub ensemble_forecast_type: u8,
pub perturbation_num: u8,
pub num_forecasts: u8,
}
#[derive(Debug, PartialEq, Eq, TryFromSlice, WriteToBuffer, Dump)]
pub struct DerivedForecast {
pub derived_forecast_type: u8,
pub num_forecasts: u8,
}
#[derive(Debug, PartialEq, Eq, TryFromSlice, WriteToBuffer, Dump)]
pub struct ProbabilityForecasts {
pub forecast_probability_num: u8,
pub total_num_forecast_probabilities: u8,
pub probability_type: u8,
#[dump(doc(
scale_factor = "Scale factor of lower limit.",
scaled_value = "Scaled value of lower limit.",
))]
pub lower_limit: ScaledValue<i8, i32>,
#[dump(doc(
scale_factor = "Scale factor of upper limit.",
scaled_value = "Scaled value of upper limit.",
))]
pub upper_limit: ScaledValue<i8, i32>,
}
#[derive(Debug, PartialEq, Eq, TryFromSlice, WriteToBuffer, Dump)]
pub struct PercentileForecasts {
pub percentile_value: u8,
}
}