From 9a90f6acfde2533edd9afb40a59811fe986f2192 Mon Sep 17 00:00:00 2001 From: Prasad Ghangal Date: Sun, 13 Oct 2019 13:54:28 +0530 Subject: [PATCH] Add http server to serve REST request (#13) Signed-off-by: Prasad Ghangal --- .goreleaser.yml | 7 +++++++ cmd/cli/main.go | 5 ++++- cmd/serve/server.go | 49 +++++++++++++++++++++++++++++++++++++++++++++ go.mod | 7 ++++++- go.sum | 12 +++++++++++ yaml2go.go | 9 ++++----- yaml2go_test.go | 11 ++++++---- 7 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 cmd/serve/server.go diff --git a/.goreleaser.yml b/.goreleaser.yml index d394aee..2753143 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -12,6 +12,13 @@ builds: - CGO_ENABLED=0 - GO111MODULE=on - GO_EXTLINK_ENABLED=0 +- id: yaml2go_serve + binary: yaml2go_serve + main: cmd/serve/server.go + env: + - CGO_ENABLED=0 + - GO111MODULE=on + - GO_EXTLINK_ENABLED=0 archives: - replacements: darwin: Darwin diff --git a/cmd/cli/main.go b/cmd/cli/main.go index 07f34a2..6ed2584 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -47,7 +47,10 @@ func main() { // Create yaml2go object and invoke Convert() y2g := yaml2go.New() - result := y2g.Convert("Yaml2Go", []byte(data)) + result, err := y2g.Convert("Yaml2Go", []byte(data)) + if err != nil { + log.Fatal("Invalid YAML") + } fmt.Printf(result) return diff --git a/cmd/serve/server.go b/cmd/serve/server.go new file mode 100644 index 0000000..8d94b83 --- /dev/null +++ b/cmd/serve/server.go @@ -0,0 +1,49 @@ +package main + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + + "github.com/PrasadG193/yaml2go" + + "github.com/julienschmidt/httprouter" + "github.com/rs/cors" +) + +const API_VERSION = "v1" +const PORT = "8080" + +func main() { + router := httprouter.New() + log.Printf("server started accepting requests on port=%s..\n", PORT) + router.POST(fmt.Sprintf("/%s/convert", API_VERSION), handleConvert) + + handler := cors.Default().Handler(router) + log.Fatal(http.ListenAndServe(":8080", handler)) +} + +func handleConvert(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + // Enable CORS + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Headers", "Content-Type") + + data, err := ioutil.ReadAll(r.Body) + if err != nil { + log.Println(err) + http.Error(w, fmt.Sprintf("Bad Request. Error: %s", err.Error()), http.StatusBadRequest) + return + } + + // Create yaml2go object and invoke Convert() + y2g := yaml2go.New() + result, err := y2g.Convert("Yaml2Go", []byte(data)) + if err != nil { + log.Println(err) + http.Error(w, fmt.Sprintf("Bad Request. Error: %s", err.Error()), http.StatusBadRequest) + return + } + io.WriteString(w, result) +} diff --git a/go.mod b/go.mod index 53b909d..f049a6f 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,9 @@ module github.com/PrasadG193/yaml2go go 1.12 -require gopkg.in/yaml.v2 v2.2.2 +require ( + github.com/julienschmidt/httprouter v1.3.0 + github.com/rs/cors v1.7.0 + github.com/stretchr/testify v1.4.0 + gopkg.in/yaml.v2 v2.2.2 +) diff --git a/go.sum b/go.sum index bd555a3..9cd29c5 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,15 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/yaml2go.go b/yaml2go.go index ef6ab9a..b8338df 100644 --- a/yaml2go.go +++ b/yaml2go.go @@ -4,7 +4,6 @@ import ( "fmt" "go/format" "gopkg.in/yaml.v2" - "log" "reflect" "strings" ) @@ -38,14 +37,14 @@ func goKeyFormat(key string) string { } // Convert transforms map[string]interface{} to go struct -func (yg *Yaml2Go) Convert(structName string, data []byte) string { +func (yg *Yaml2Go) Convert(structName string, data []byte) (string, error) { yg.StructMap = make(map[string]string) // Unmarshal to map[string]interface{} var obj map[string]interface{} err := yaml.Unmarshal(data, &obj) if err != nil { - log.Fatal("Failed to parse input") + return "", err } yg.AppendResult("Yaml2Go", "// Yaml2Go\n") @@ -62,9 +61,9 @@ func (yg *Yaml2Go) Convert(structName string, data []byte) string { // Convert result into go format goFormat, err := format.Source([]byte(result)) if err != nil { - log.Fatal("go fmt error:", err) + return "", err } - return string(goFormat) + return string(goFormat), nil } // Structify transforms map key values to struct fields diff --git a/yaml2go_test.go b/yaml2go_test.go index a317b03..55ecefb 100644 --- a/yaml2go_test.go +++ b/yaml2go_test.go @@ -6,13 +6,15 @@ import ( "log" "strings" "testing" + + "github.com/stretchr/testify/assert" ) -func conversion(data []byte) string { +func conversion(data []byte) (string, error) { y2g := New() - result := y2g.Convert("Yaml2Go", data) + result, err := y2g.Convert("Yaml2Go", data) - return result + return result, err } func compareResults(actual []string, expected map[string]bool) error { @@ -74,7 +76,8 @@ func TestConvert(t *testing.T) { if err != nil { log.Fatal("Failed to access tests/example1.yaml. ", err.Error()) } - resp := conversion(data) + resp, err := conversion(data) + assert.Nil(t, err) // Compare result err = compareResults(strings.Split(resp, "\n"), expected["example1"])