diff options
author | Ben Burwell <ben@benburwell.com> | 2015-11-19 11:02:12 -0500 |
---|---|---|
committer | Ben Burwell <ben@benburwell.com> | 2015-11-19 11:02:12 -0500 |
commit | 81f58028b6e7473a78d8de0070bd6511287fbe0a (patch) | |
tree | 7b41af196f9a549d2067826aebcc6c1f26998776 /main.go | |
parent | fe22af7afdd2cffbd8395c7151f6e957db36f065 (diff) | |
parent | 5be5fe170fd317a0ed5b85b513ccf3f52e433521 (diff) |
Merge pull request #1 from benburwell/distance-calc
Add distance calculation functionality
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 55 |
1 files changed, 48 insertions, 7 deletions
@@ -8,6 +8,17 @@ import ( "strings" ) +type DistanceZipcode struct { + ZipcodeDetails + Miles float64 `json:"miles"` + Kilometers float64 `json:"kilometers"` +} + +type DistanceResponse struct { + ZipcodeDetails + Distance DistanceZipcode `json:"distance"` +} + func main() { db := getInitializedDatabase() http.HandleFunc("/zip/", func(w http.ResponseWriter, r *http.Request) { @@ -37,25 +48,55 @@ func getListeningAddress() string { } func handleZipcodeRequest(response http.ResponseWriter, request *http.Request, db *ZipcodeDatabase) { - zip := zipcodeForRequest(request) - if details := db.Find(zip); details == nil { + zip := zipcodeForPath(request, db) + if zip == nil { http.Error(response, "", 404) } else { setResponseHeaders(response) - sendZipcodeDetails(details, response) + if zip2 := zipcodeForQuery(request, db); zip2 != nil { + sendDistanceResponse(zip, zip2, response) + } else { + sendJson(response, zip) + } } } +func sendDistanceResponse(zip1, zip2 *ZipcodeDetails, writer http.ResponseWriter) { + mi, km := zip1.DistanceTo(zip2) + response := &DistanceResponse{} + response.ZipcodeDetails = *zip1 + response.Distance.ZipcodeDetails = *zip2 + response.Distance.Miles = mi + response.Distance.Kilometers = km + sendJson(writer, response) +} + +func sendJson(writer http.ResponseWriter, data interface{}) { + bytes, _ := json.MarshalIndent(data, "", " ") + fmt.Fprintf(writer, string(bytes)) +} + func setResponseHeaders(response http.ResponseWriter) { response.Header().Set("Access-Control-Allow-Origin", "*") response.Header().Set("Content-Type", "application/json") } -func zipcodeForRequest(request *http.Request) string { +func extractZipFromPath(request *http.Request) string { return request.URL.Path[len("/zip/"):] } -func sendZipcodeDetails(details *ZipcodeDetails, response http.ResponseWriter) { - data, _ := json.MarshalIndent(details, "", " ") - fmt.Fprintf(response, string(data)) +func zipcodeForPath(request *http.Request, db *ZipcodeDatabase) *ZipcodeDetails { + return db.Find(extractZipFromPath(request)) +} + +func extractZipFromQuery(request *http.Request) string { + if param := request.URL.Query()["distance"]; param != nil { + return param[0] + } else { + return "" + } +} + +func zipcodeForQuery(request *http.Request, db *ZipcodeDatabase) *ZipcodeDetails { + return db.Find(extractZipFromQuery(request)) } |