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 */