Create Geocoder abstraction

This commit is contained in:
Matthew Oslan
2020-06-06 14:08:59 -04:00
parent 85433e6ce6
commit 4e65661a70
3 changed files with 45 additions and 22 deletions

View File

@@ -0,0 +1,11 @@
import { GeoCoordinates } from "../../types";
export abstract class Geocoder {
/**
* Converts a location name to geographic coordinates.
* @param location A location name.
* @return A Promise that will be resolved with the GeoCoordinates of the specified location, or rejected with a
* CodedError.
*/
public abstract geocodeLocation( location: string ): Promise<GeoCoordinates>;
}

View File

@@ -0,0 +1,31 @@
import { GeoCoordinates } from "../../types";
import { CodedError, ErrorCode } from "../../errors";
import { httpJSONRequest } from "../weather";
import { Geocoder } from "./Geocoder";
export default class WUnderground extends Geocoder {
public async geocodeLocation( location: string ): Promise<GeoCoordinates> {
// Generate URL for autocomplete request
const url = "http://autocomplete.wunderground.com/aq?h=0&query=" +
encodeURIComponent( location );
let data;
try {
data = await httpJSONRequest( url );
} catch ( err ) {
// If the request fails, indicate no data was found.
throw new CodedError( ErrorCode.LocationServiceApiError );
}
// Check if the data is valid
if ( typeof data.RESULTS === "object" && data.RESULTS.length && data.RESULTS[ 0 ].tz !== "MISSING" ) {
// If it is, reply with an array containing the GPS coordinates
return [ parseFloat( data.RESULTS[ 0 ].lat ), parseFloat( data.RESULTS[ 0 ].lon ) ];
} else {
// Otherwise, indicate no data was found
throw new CodedError( ErrorCode.NoLocationFound );
}
}
}