grib/codetables/
old.rs

1use std::fmt::{self, Display, Formatter};
2
3pub struct LookupResult(Result<&'static &'static str, ConversionError>);
4
5impl LookupResult {
6    /// Returns WMO description of the code.
7    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];