Skip to main content

boj_client/model/
response.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5/// Shared response metadata returned by BOJ endpoints.
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7pub struct ResponseMeta {
8    /// BOJ status code (`200`, `400`, `500`, `503`, ...).
9    pub status: u16,
10    /// BOJ message identifier.
11    pub message_id: String,
12    /// Human-readable BOJ message.
13    pub message: String,
14    /// Response date value provided by BOJ, when available.
15    pub date: Option<String>,
16}
17
18/// A single survey data point in a time series.
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
20pub struct DataPoint {
21    /// Survey date key (for example, year or period token from API payload).
22    pub survey_date: String,
23    /// Observed value at `survey_date`; `None` when BOJ omits the value.
24    pub value: Option<String>,
25}
26
27/// Echoed request parameters for `getDataCode`.
28#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
29pub struct CodeParameterEcho {
30    /// Echoed `format` parameter, if present in the response payload.
31    pub format: Option<String>,
32    /// Echoed `lang` parameter, if present in the response payload.
33    pub lang: Option<String>,
34    /// Echoed `db` parameter, if present in the response payload.
35    pub db: Option<String>,
36    /// Echoed `startDate` parameter, if present in the response payload.
37    pub start_date: Option<String>,
38    /// Echoed `endDate` parameter, if present in the response payload.
39    pub end_date: Option<String>,
40    /// Echoed `startPosition` parameter, if present in the response payload.
41    pub start_position: Option<u32>,
42    /// Additional parameter echoes not normalized into dedicated fields.
43    #[serde(default)]
44    pub extras: BTreeMap<String, String>,
45}
46
47/// Echoed request parameters for `getDataLayer`.
48#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
49pub struct LayerParameterEcho {
50    /// Echoed `format` parameter, if present in the response payload.
51    pub format: Option<String>,
52    /// Echoed `lang` parameter, if present in the response payload.
53    pub lang: Option<String>,
54    /// Echoed `db` parameter, if present in the response payload.
55    pub db: Option<String>,
56    /// Echoed `frequency` parameter, if present in the response payload.
57    pub frequency: Option<String>,
58    /// Echoed first layer index, if present in the response payload.
59    pub layer1: Option<u32>,
60    /// Echoed second layer index, if present in the response payload.
61    pub layer2: Option<u32>,
62    /// Echoed third layer index, if present in the response payload.
63    pub layer3: Option<u32>,
64    /// Echoed fourth layer index, if present in the response payload.
65    pub layer4: Option<u32>,
66    /// Echoed fifth layer index, if present in the response payload.
67    pub layer5: Option<u32>,
68    /// Echoed `startDate` parameter, if present in the response payload.
69    pub start_date: Option<String>,
70    /// Echoed `endDate` parameter, if present in the response payload.
71    pub end_date: Option<String>,
72    /// Echoed `startPosition` parameter, if present in the response payload.
73    pub start_position: Option<u32>,
74    /// Additional parameter echoes not normalized into dedicated fields.
75    #[serde(default)]
76    pub extras: BTreeMap<String, String>,
77}
78
79/// One time-series entry from `getDataCode`.
80#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
81pub struct CodeSeries {
82    /// Time-series code returned by BOJ.
83    pub series_code: String,
84    /// Japanese time-series name, when available for response language/format.
85    pub name_of_time_series_j: Option<String>,
86    /// English time-series name, when available for response language/format.
87    pub name_of_time_series: Option<String>,
88    /// Japanese unit label, when available for response language/format.
89    pub unit_j: Option<String>,
90    /// English unit label, when available for response language/format.
91    pub unit: Option<String>,
92    /// Frequency label reported by BOJ, when available.
93    pub frequency: Option<String>,
94    /// Japanese category label, when available for response language/format.
95    pub category_j: Option<String>,
96    /// English category label, when available for response language/format.
97    pub category: Option<String>,
98    /// Last update timestamp/text from BOJ, when available.
99    pub last_update: Option<String>,
100    /// Ordered data points in the series.
101    #[serde(default)]
102    pub points: Vec<DataPoint>,
103    /// Additional series fields not normalized into dedicated fields.
104    #[serde(default)]
105    pub extras: BTreeMap<String, Option<String>>,
106}
107
108/// One time-series entry from `getDataLayer`.
109#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
110pub struct LayerSeries {
111    /// Time-series code returned by BOJ.
112    pub series_code: String,
113    /// Japanese time-series name, when available for response language/format.
114    pub name_of_time_series_j: Option<String>,
115    /// English time-series name, when available for response language/format.
116    pub name_of_time_series: Option<String>,
117    /// Japanese unit label, when available for response language/format.
118    pub unit_j: Option<String>,
119    /// English unit label, when available for response language/format.
120    pub unit: Option<String>,
121    /// Frequency label reported by BOJ, when available.
122    pub frequency: Option<String>,
123    /// Japanese category label, when available for response language/format.
124    pub category_j: Option<String>,
125    /// English category label, when available for response language/format.
126    pub category: Option<String>,
127    /// Last update timestamp/text from BOJ, when available.
128    pub last_update: Option<String>,
129    /// Ordered data points in the series.
130    #[serde(default)]
131    pub points: Vec<DataPoint>,
132    /// Additional series fields not normalized into dedicated fields.
133    #[serde(default)]
134    pub extras: BTreeMap<String, Option<String>>,
135}
136
137/// One metadata entry from `getMetadata`.
138#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
139pub struct MetadataEntry {
140    /// Time-series code, when present for the metadata row.
141    pub series_code: Option<String>,
142    /// Japanese time-series name, when available for response language/format.
143    pub name_of_time_series_j: Option<String>,
144    /// English time-series name, when available for response language/format.
145    pub name_of_time_series: Option<String>,
146    /// Japanese unit label, when available for response language/format.
147    pub unit_j: Option<String>,
148    /// English unit label, when available for response language/format.
149    pub unit: Option<String>,
150    /// Frequency label reported by BOJ, when available.
151    pub frequency: Option<String>,
152    /// Japanese category label, when available for response language/format.
153    pub category_j: Option<String>,
154    /// English category label, when available for response language/format.
155    pub category: Option<String>,
156    /// First layer index, when present.
157    pub layer1: Option<u32>,
158    /// Second layer index, when present.
159    pub layer2: Option<u32>,
160    /// Third layer index, when present.
161    pub layer3: Option<u32>,
162    /// Fourth layer index, when present.
163    pub layer4: Option<u32>,
164    /// Fifth layer index, when present.
165    pub layer5: Option<u32>,
166    /// Start of the time series, when present.
167    pub start_of_the_time_series: Option<String>,
168    /// End of the time series, when present.
169    pub end_of_the_time_series: Option<String>,
170    /// Last update timestamp/text from BOJ, when available.
171    pub last_update: Option<String>,
172    /// Japanese notes, when available for response language/format.
173    pub notes_j: Option<String>,
174    /// English notes, when available for response language/format.
175    pub notes: Option<String>,
176    /// Additional metadata fields not normalized into dedicated fields.
177    #[serde(default)]
178    pub extras: BTreeMap<String, Option<String>>,
179}
180
181/// Decoded response model for `getDataCode`.
182#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
183pub struct CodeResponse {
184    /// Response metadata.
185    pub meta: ResponseMeta,
186    /// Echoed request parameters.
187    pub parameter: CodeParameterEcho,
188    /// Pagination cursor for subsequent calls, when available.
189    pub next_position: Option<u32>,
190    /// Returned series entries.
191    pub series: Vec<CodeSeries>,
192    /// Raw decoded text body preserved for diagnostics.
193    pub raw: String,
194}
195
196/// Decoded response model for `getDataLayer`.
197#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
198pub struct LayerResponse {
199    /// Response metadata.
200    pub meta: ResponseMeta,
201    /// Echoed request parameters.
202    pub parameter: LayerParameterEcho,
203    /// Pagination cursor for subsequent calls, when available.
204    pub next_position: Option<u32>,
205    /// Returned series entries.
206    pub series: Vec<LayerSeries>,
207    /// Raw decoded text body preserved for diagnostics.
208    pub raw: String,
209}
210
211/// Decoded response model for `getMetadata`.
212#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
213pub struct MetadataResponse {
214    /// Response metadata.
215    pub meta: ResponseMeta,
216    /// Database code corresponding to the metadata response.
217    pub db: String,
218    /// Returned metadata entries.
219    pub entries: Vec<MetadataEntry>,
220    /// Raw decoded text body preserved for diagnostics.
221    pub raw: String,
222}