1use std::fmt::{self, Display, Formatter};
2
3pub struct LookupResult(Result<&'static &'static str, ConversionError>);
4
5impl LookupResult {
6 pub fn description(&self) -> Option<String> {
8 let Self(result) = self;
9 let s = result.as_ref().ok()?.to_string();
10 Some(s)
11 }
12}
13
14impl Display for LookupResult {
15 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
16 let s = match &self.0 {
17 Ok(s) => s.to_string(),
18 Err(e) => e.to_string(),
19 };
20 write!(f, "{s}")
21 }
22}
23
24#[derive(Debug, Clone, PartialEq, Eq, Hash)]
25pub enum ConversionError {
26 Unimplemented(usize),
27}
28
29impl Display for ConversionError {
30 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
31 match self {
32 Self::Unimplemented(code) => write!(f, "code '{code}' is not implemented"),
33 }
34 }
35}
36
37include!(concat!(env!("OUT_DIR"), "/cct.rs"));
38include!(concat!(env!("OUT_DIR"), "/grib2_codeflag.rs"));
39
40pub struct CommonCodeTable00;
41
42impl ArrayLookup for CommonCodeTable00 {
43 fn data(&self) -> &'static [&'static str] {
44 COMMON_CODE_TABLE_00
45 }
46}
47
48pub struct CommonCodeTable11;
49
50impl ArrayLookup for CommonCodeTable11 {
51 fn data(&self) -> &'static [&'static str] {
52 COMMON_CODE_TABLE_11
53 }
54}
55
56pub struct CodeTable0_0;
57
58impl ArrayLookup for CodeTable0_0 {
59 fn data(&self) -> &'static [&'static str] {
60 CODE_TABLE_0_0
61 }
62}
63
64pub struct CodeTable1_1;
65
66impl ArrayLookup for CodeTable1_1 {
67 fn data(&self) -> &'static [&'static str] {
68 CODE_TABLE_1_1
69 }
70}
71
72pub struct CodeTable1_2;
73
74impl ArrayLookup for CodeTable1_2 {
75 fn data(&self) -> &'static [&'static str] {
76 CODE_TABLE_1_2
77 }
78}
79
80pub struct CodeTable1_3;
81
82impl ArrayLookup for CodeTable1_3 {
83 fn data(&self) -> &'static [&'static str] {
84 CODE_TABLE_1_3
85 }
86}
87
88pub struct CodeTable1_4;
89
90impl ArrayLookup for CodeTable1_4 {
91 fn data(&self) -> &'static [&'static str] {
92 CODE_TABLE_1_4
93 }
94}
95
96pub struct CodeTable3_1;
97
98impl ArrayLookup for CodeTable3_1 {
99 fn data(&self) -> &'static [&'static str] {
100 CODE_TABLE_3_1
101 }
102}
103
104pub struct CodeTable4_0;
105
106impl ArrayLookup for CodeTable4_0 {
107 fn data(&self) -> &'static [&'static str] {
108 CODE_TABLE_4_0
109 }
110}
111
112pub struct CodeTable4_1 {
113 discipline: u8,
114}
115
116impl CodeTable4_1 {
117 pub fn new(discipline: u8) -> Self {
118 Self { discipline }
119 }
120}
121
122impl ArrayLookup for CodeTable4_1 {
123 fn data(&self) -> &'static [&'static str] {
124 match self.discipline {
125 0 => CODE_TABLE_4_1_0,
126 1 => CODE_TABLE_4_1_1,
127 2 => CODE_TABLE_4_1_2,
128 3 => CODE_TABLE_4_1_3,
129 4 => CODE_TABLE_4_1_4,
130 10 => CODE_TABLE_4_1_10,
131 20 => CODE_TABLE_4_1_20,
132 _ => CODE_TABLE_UNSUPPORTED,
133 }
134 }
135}
136
137pub struct CodeTable4_2 {
138 discipline: u8,
139 parameter: u8,
140}
141
142impl CodeTable4_2 {
143 pub fn new(discipline: u8, parameter: u8) -> Self {
144 Self {
145 discipline,
146 parameter,
147 }
148 }
149}
150
151impl ArrayLookup for CodeTable4_2 {
152 fn data(&self) -> &'static [&'static str] {
153 match (self.discipline, self.parameter) {
154 (0, 0) => CODE_TABLE_4_2_0_0,
155 (0, 1) => CODE_TABLE_4_2_0_1,
156 (0, 2) => CODE_TABLE_4_2_0_2,
157 (0, 3) => CODE_TABLE_4_2_0_3,
158 (0, 4) => CODE_TABLE_4_2_0_4,
159 (0, 5) => CODE_TABLE_4_2_0_5,
160 (0, 6) => CODE_TABLE_4_2_0_6,
161 (0, 7) => CODE_TABLE_4_2_0_7,
162 (0, 13) => CODE_TABLE_4_2_0_13,
163 (0, 14) => CODE_TABLE_4_2_0_14,
164 (0, 15) => CODE_TABLE_4_2_0_15,
165 (0, 16) => CODE_TABLE_4_2_0_16,
166 (0, 17) => CODE_TABLE_4_2_0_17,
167 (0, 18) => CODE_TABLE_4_2_0_18,
168 (0, 19) => CODE_TABLE_4_2_0_19,
169 (0, 20) => CODE_TABLE_4_2_0_20,
170 (0, 190) => CODE_TABLE_4_2_0_190,
171 (0, 191) => CODE_TABLE_4_2_0_191,
172 (1, 0) => CODE_TABLE_4_2_1_0,
173 (1, 1) => CODE_TABLE_4_2_1_1,
174 (1, 2) => CODE_TABLE_4_2_1_2,
175 (2, 0) => CODE_TABLE_4_2_2_0,
176 (2, 3) => CODE_TABLE_4_2_2_3,
177 (2, 4) => CODE_TABLE_4_2_2_4,
178 (2, 5) => CODE_TABLE_4_2_2_5,
179 (3, 0) => CODE_TABLE_4_2_3_0,
180 (3, 1) => CODE_TABLE_4_2_3_1,
181 (3, 2) => CODE_TABLE_4_2_3_2,
182 (3, 3) => CODE_TABLE_4_2_3_3,
183 (3, 4) => CODE_TABLE_4_2_3_4,
184 (3, 5) => CODE_TABLE_4_2_3_5,
185 (3, 6) => CODE_TABLE_4_2_3_6,
186 (4, 0) => CODE_TABLE_4_2_4_0,
187 (4, 1) => CODE_TABLE_4_2_4_1,
188 (4, 2) => CODE_TABLE_4_2_4_2,
189 (4, 3) => CODE_TABLE_4_2_4_3,
190 (4, 4) => CODE_TABLE_4_2_4_4,
191 (4, 5) => CODE_TABLE_4_2_4_5,
192 (4, 6) => CODE_TABLE_4_2_4_6,
193 (4, 7) => CODE_TABLE_4_2_4_7,
194 (4, 8) => CODE_TABLE_4_2_4_8,
195 (4, 9) => CODE_TABLE_4_2_4_9,
196 (4, 10) => CODE_TABLE_4_2_4_10,
197 (10, 0) => CODE_TABLE_4_2_10_0,
198 (10, 1) => CODE_TABLE_4_2_10_1,
199 (10, 2) => CODE_TABLE_4_2_10_2,
200 (10, 3) => CODE_TABLE_4_2_10_3,
201 (10, 4) => CODE_TABLE_4_2_10_4,
202 (10, 191) => CODE_TABLE_4_2_10_191,
203 (20, 0) => CODE_TABLE_4_2_20_0,
204 (20, 1) => CODE_TABLE_4_2_20_1,
205 (20, 2) => CODE_TABLE_4_2_20_2,
206 _ => CODE_TABLE_UNSUPPORTED,
207 }
208 }
209}
210
211pub struct CodeTable4_3;
212
213impl ArrayLookup for CodeTable4_3 {
214 fn data(&self) -> &'static [&'static str] {
215 CODE_TABLE_4_3
216 }
217}
218
219pub struct CodeTable4_4;
220
221impl ArrayLookup for CodeTable4_4 {
222 fn data(&self) -> &'static [&'static str] {
223 CODE_TABLE_4_4
224 }
225}
226
227pub struct CodeTable4_5;
228
229impl ArrayLookup for CodeTable4_5 {
230 fn data(&self) -> &'static [&'static str] {
231 CODE_TABLE_4_5
232 }
233}
234
235pub struct CodeTable5_0;
236
237impl ArrayLookup for CodeTable5_0 {
238 fn data(&self) -> &'static [&'static str] {
239 CODE_TABLE_5_0
240 }
241}
242
243pub trait Lookup {
244 fn lookup(&self, code: usize) -> LookupResult;
245}
246
247pub trait ArrayLookup: Lookup {
248 fn data(&self) -> &'static [&'static str];
249}
250
251impl<T: ArrayLookup> Lookup for T {
252 fn lookup(&self, code: usize) -> LookupResult {
253 let result = self
254 .data()
255 .get(code)
256 .ok_or(ConversionError::Unimplemented(code));
257 LookupResult(result)
258 }
259}
260
261const CODE_TABLE_UNSUPPORTED: &[&str] = &[];
262
263pub(crate) const SUPPORTED_PROD_DEF_TEMPLATE_NUMBERS: [u16; 71] = [
264 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 20, 30, 31, 32, 33, 34, 35, 40, 41, 42,
265 43, 44, 45, 46, 47, 48, 49, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 67, 68, 70, 71, 72,
266 73, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 91, 254, 1000, 1001, 1002, 1100, 1101,
267];