diff options
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))  } | 
