Waldo.res.mjs
1// Generated by ReScript, PLEASE EDIT WITH CARE
2
3import * as Log from "../utils/Log.res.mjs";
4import * as Fetch from "./Fetch.res.mjs";
5import * as Core__JSON from "@rescript/core/lib/es6/src/Core__JSON.res.mjs";
6import * as Core__Array from "@rescript/core/lib/es6/src/Core__Array.res.mjs";
7import * as Core__Option from "@rescript/core/lib/es6/src/Core__Option.res.mjs";
8import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
9
10function $$encodeURIComponent(str) {
11 return encodeURIComponent(str);
12}
13
14function decodeResult(json) {
15 let dict = Core__JSON.Decode.object(json);
16 if (dict !== undefined) {
17 let gid = Core__Option.map(Core__Option.flatMap(dict["gid"], Core__JSON.Decode.float), f => f | 0);
18 let name = Core__Option.flatMap(dict["name"], Core__JSON.Decode.string);
19 let placetype = Core__Option.flatMap(dict["placetype"], Core__JSON.Decode.string);
20 let lon = Core__Option.flatMap(dict["lon"], Core__JSON.Decode.float);
21 let lat = Core__Option.flatMap(dict["lat"], Core__JSON.Decode.float);
22 let distance = Core__Option.flatMap(dict["distance"], Core__JSON.Decode.float);
23 let bearing = Core__Option.flatMap(dict["bearing"], Core__JSON.Decode.float);
24 let region = Core__Option.map(Core__Option.flatMap(dict["region"], Core__JSON.Decode.array), arr => Core__Array.filterMap(arr, Core__JSON.Decode.string));
25 let country = Core__Option.flatMap(dict["country"], Core__JSON.Decode.string);
26 if (gid !== undefined && name !== undefined && placetype !== undefined && lon !== undefined && lat !== undefined && distance !== undefined && bearing !== undefined && region !== undefined && country !== undefined) {
27 return {
28 gid: gid,
29 name: name,
30 placetype: placetype,
31 lon: lon,
32 lat: lat,
33 distance: distance,
34 bearing: bearing,
35 region: region,
36 country: country
37 };
38 }
39 let missing = [];
40 if (Core__Option.isNone(gid)) {
41 missing.push("gid");
42 }
43 if (Core__Option.isNone(name)) {
44 missing.push("name");
45 }
46 if (Core__Option.isNone(placetype)) {
47 missing.push("placetype");
48 }
49 if (Core__Option.isNone(lon)) {
50 missing.push("lon");
51 }
52 if (Core__Option.isNone(lat)) {
53 missing.push("lat");
54 }
55 if (Core__Option.isNone(distance)) {
56 missing.push("distance");
57 }
58 if (Core__Option.isNone(bearing)) {
59 missing.push("bearing");
60 }
61 if (Core__Option.isNone(region)) {
62 missing.push("region");
63 }
64 if (Core__Option.isNone(country)) {
65 missing.push("country");
66 }
67 if (missing.length > 0) {
68 console.error(`[Waldo] decodeResult: Missing fields: ` + missing.join(", "));
69 }
70 return;
71 }
72 console.error("[Waldo] decodeResult: Input is not a JSON object");
73}
74
75function decodeGeocodeResponse(json) {
76 let dict = Core__JSON.Decode.object(json);
77 if (dict !== undefined) {
78 let results = Core__Option.map(Core__Option.flatMap(dict["results"], Core__JSON.Decode.array), arr => Core__Array.filterMap(arr, decodeResult));
79 let numResults = Core__Option.map(Core__Option.flatMap(dict["num_results"], Core__JSON.Decode.float), f => f | 0);
80 if (results !== undefined && numResults !== undefined) {
81 return {
82 results: results,
83 numResults: numResults
84 };
85 }
86 let missing = [];
87 if (Core__Option.isNone(results)) {
88 missing.push("results");
89 }
90 if (Core__Option.isNone(numResults)) {
91 missing.push("num_results");
92 }
93 console.error(`[Waldo] decodeGeocodeResponse: Missing fields: ` + missing.join(", "));
94 return;
95 }
96 console.error("[Waldo] decodeGeocodeResponse: Input is not a JSON object");
97}
98
99function decodeErrorResponse(json) {
100 let dict = Core__JSON.Decode.object(json);
101 if (dict === undefined) {
102 return;
103 }
104 let error = Core__Option.flatMap(dict["error"], Core__JSON.Decode.string);
105 if (error !== undefined) {
106 return {
107 error: error
108 };
109 }
110}
111
112function buildUrl(params) {
113 let encodedQuery = $$encodeURIComponent(params.query);
114 let queryParts = [`q=` + encodedQuery];
115 let match = params.biasPoint;
116 if (match !== undefined) {
117 queryParts.push(`lon=` + match[0].toString());
118 queryParts.push(`lat=` + match[1].toString());
119 }
120 return `/forward?` + queryParts.join("&");
121}
122
123async function geocode(params) {
124 let url = buildUrl(params);
125 try {
126 let response = await Fetch.send(Fetch.onResponse(Fetch.get(url), json => json, (status, message) => Object.fromEntries([
127 [
128 "__error",
129 true
130 ],
131 [
132 "__status",
133 status
134 ],
135 [
136 "__message",
137 message
138 ]
139 ])));
140 let responseStr;
141 try {
142 responseStr = JSON.stringify(response);
143 } catch (exn) {
144 responseStr = "[Failed to stringify response]";
145 }
146 Log.debug(`[Waldo] Forward: Response content: ` + responseStr, undefined);
147 let obj = Core__JSON.Decode.object(response);
148 if (obj !== undefined) {
149 let match = obj["__error"];
150 if (match !== undefined) {
151 let s = obj["__status"];
152 let status;
153 if (s !== undefined) {
154 let n = Core__JSON.Decode.float(s);
155 status = n !== undefined ? (n | 0).toString() : "0";
156 } else {
157 status = "0";
158 }
159 let m = obj["__message"];
160 let message;
161 if (m !== undefined) {
162 let s$1 = Core__JSON.Decode.string(m);
163 message = s$1 !== undefined ? s$1 : "Unknown error";
164 } else {
165 message = "Unknown error";
166 }
167 console.error(`[Waldo] Forward: Fetch error: ` + status + ` - ` + message);
168 return {
169 TAG: "Error",
170 _0: status + `: ` + message
171 };
172 }
173 let resp = decodeGeocodeResponse(response);
174 if (resp !== undefined) {
175 return {
176 TAG: "Success",
177 _0: resp.results
178 };
179 }
180 console.error("[Waldo] Forward: Failed to decode geocode response");
181 let err = decodeErrorResponse(response);
182 if (err !== undefined) {
183 console.error(`[Waldo] Forward: API error: ` + err.error);
184 return {
185 TAG: "Error",
186 _0: err.error
187 };
188 } else {
189 console.error("[Waldo] Forward: Unknown response format");
190 return {
191 TAG: "Error",
192 _0: "Invalid response format"
193 };
194 }
195 }
196 console.error("[Waldo] Forward: Response is not a valid JSON object");
197 return {
198 TAG: "Error",
199 _0: "Invalid JSON response"
200 };
201 } catch (raw_exn) {
202 let exn$1 = Primitive_exceptions.internalToException(raw_exn);
203 console.error("[Waldo] Forward: Network error or exception:", exn$1);
204 return {
205 TAG: "NetworkError",
206 _0: "Network error"
207 };
208 }
209}
210
211let Forward = {
212 buildUrl: buildUrl,
213 geocode: geocode
214};
215
216function buildUrl$1(params) {
217 let lonStr = params.lon.toString();
218 let latStr = params.lat.toString();
219 return `/reverse?lon=` + lonStr + `&lat=` + latStr;
220}
221
222async function geocode$1(params) {
223 let url = buildUrl$1(params);
224 try {
225 let response = await Fetch.send(Fetch.onResponse(Fetch.get(url), json => json, (status, message) => Object.fromEntries([
226 [
227 "__error",
228 true
229 ],
230 [
231 "__status",
232 status
233 ],
234 [
235 "__message",
236 message
237 ]
238 ])));
239 let obj = Core__JSON.Decode.object(response);
240 if (obj === undefined) {
241 return {
242 TAG: "Error",
243 _0: "Invalid JSON response"
244 };
245 }
246 let match = obj["__error"];
247 if (match !== undefined) {
248 let s = obj["__status"];
249 let status;
250 if (s !== undefined) {
251 let n = Core__JSON.Decode.float(s);
252 status = n !== undefined ? (n | 0).toString() : "0";
253 } else {
254 status = "0";
255 }
256 let m = obj["__message"];
257 let message;
258 if (m !== undefined) {
259 let s$1 = Core__JSON.Decode.string(m);
260 message = s$1 !== undefined ? s$1 : "Unknown error";
261 } else {
262 message = "Unknown error";
263 }
264 return {
265 TAG: "Error",
266 _0: status + `: ` + message
267 };
268 }
269 let resp = decodeGeocodeResponse(response);
270 if (resp !== undefined) {
271 return {
272 TAG: "Success",
273 _0: resp.results
274 };
275 }
276 let err = decodeErrorResponse(response);
277 if (err !== undefined) {
278 return {
279 TAG: "Error",
280 _0: err.error
281 };
282 } else {
283 return {
284 TAG: "Error",
285 _0: "Invalid response format"
286 };
287 }
288 } catch (exn) {
289 return {
290 TAG: "NetworkError",
291 _0: "Network error"
292 };
293 }
294}
295
296let Reverse = {
297 buildUrl: buildUrl$1,
298 geocode: geocode$1
299};
300
301export {
302 $$encodeURIComponent,
303 decodeResult,
304 decodeGeocodeResponse,
305 decodeErrorResponse,
306 Forward,
307 Reverse,
308}
309/* Fetch Not a pure module */