Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions farewells.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[
{ "language": "english", "farewell": "Goodbye, World!" },
{ "language": "british", "farewell": "Goodbye, World! Cheerio!" },
{ "language": "french", "farewell": "Au revoir, Monde !" },
{ "language": "italian", "farewell": "Arrivederci, Mondo!" },
{ "language": "spanish", "farewell": "¡Adiós, Mundo!" },
{ "language": "german", "farewell": "Auf Wiedersehen, Welt!" },
{ "language": "mandarin", "farewell": "再见,世界!" },
{ "language": "hindi", "farewell": "अलविदा दुनिया!" },
{ "language": "arabic", "farewell": "وداعا أيها العالم!" },
{ "language": "bengali", "farewell": "বিদায় বিশ্ব!" },
{ "language": "russian", "farewell": "До свидания, мир!" },
{ "language": "portuguese", "farewell": "Tchau, Mundo!" },
{ "language": "urdu", "farewell": "الوداع، دنیا!" },
{ "language": "indonesian", "farewell": "Selamat tinggal Dunia!" },
{ "language": "japanese", "farewell": "さようなら世界!" },
{ "language": "marathi", "farewell": "निरोप जग!" },
{ "language": "telugu", "farewell": "వీడ్కోలు ప్రపంచం!" }
]
79 changes: 76 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,34 @@ import (
//go:embed greetings.json
var greetingsJson []byte

//go:embed farewells.json
var farewellsJson []byte

type Greeting struct {
Language string `json:"language"`
Greeting string `json:"greeting"`
}

type Farewell struct {
Language string `json:"language"`
Farewell string `json:"farewell"`
}

func main() {
var greetings []*Greeting
err := json.Unmarshal(greetingsJson, &greetings)
if err != nil {
fmt.Printf("error loading greetings: %s\n", err)
os.Exit(1)
}

var farewells []*Farewell
err = json.Unmarshal(farewellsJson, &farewells)
if err != nil {
fmt.Printf("error loading farewells: %s\n", err)
os.Exit(1)
}

router := mux.NewRouter()

router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
Expand All @@ -36,22 +52,55 @@ func main() {
greeting, err := SelectGreeting(greetings, "random")
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
_, err = w.Write([]byte(FormatGreetingResponse(greeting)))
if err != nil {
panic(err)
}
}).Methods("GET")

// Farewell endpoints - must be defined before /{language} to avoid conflicts
router.HandleFunc("/farewell", func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("got /farewell request from %s\n", r.RemoteAddr)
w.Header().Set("Content-Type", "application/json")
farewell, err := SelectFarewell(farewells, "random")
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
_, err = w.Write([]byte(FormatFarewellResponse(farewell)))
if err != nil {
panic(err)
}
}).Methods("GET")

router.HandleFunc("/farewell/{language}", func(w http.ResponseWriter, r *http.Request) {
language := mux.Vars(r)["language"]
fmt.Printf("got /farewell/{language} request from %s\n", r.RemoteAddr)
w.Header().Set("Content-Type", "application/json")
farewell, err := SelectFarewell(farewells, language)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
_, err = w.Write([]byte(FormatResponse(greeting)))
_, err = w.Write([]byte(FormatFarewellResponse(farewell)))
if err != nil {
panic(err)
}
}).Methods("GET")

// Language-specific greeting endpoint - must be last to avoid conflicts
router.HandleFunc("/{language}", func(w http.ResponseWriter, r *http.Request) {
language := mux.Vars(r)["language"]
fmt.Printf("got /{language} request from %s\n", r.RemoteAddr)
w.Header().Set("Content-Type", "application/json")
greeting, err := SelectGreeting(greetings, language)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
_, err = w.Write([]byte(FormatResponse(greeting)))
_, err = w.Write([]byte(FormatGreetingResponse(greeting)))
if err != nil {
panic(err)
}
Expand All @@ -74,10 +123,14 @@ func main() {
}
}

func FormatResponse(greeting *Greeting) string {
func FormatGreetingResponse(greeting *Greeting) string {
return fmt.Sprintf("{\"greeting\":\"%s\"}", greeting.Greeting)
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
}
func FormatResponse(greeting *Greeting) string {
return fmt.Sprintf("{\"greeting\":\"%s\"}", greeting.Greeting)
}


func FormatFarewellResponse(farewell *Farewell) string {
return fmt.Sprintf("{\"farewell\":\"%s\"}", farewell.Farewell)
}

func SelectGreeting(greetings []*Greeting, language string) (*Greeting, error) {
if len(greetings) == 0 {
return nil, errors.New("no greetings available")
Expand All @@ -97,3 +150,23 @@ func SelectGreeting(greetings []*Greeting, language string) (*Greeting, error) {

return nil, fmt.Errorf("no greeting found for language '%s'", language)
}

func SelectFarewell(farewells []*Farewell, language string) (*Farewell, error) {
if len(farewells) == 0 {
return nil, errors.New("no farewells available")
}

if language == "random" {
// Get random item from farewells slice
randomIndex := rand.Intn(len(farewells))
return farewells[randomIndex], nil
}

for _, farewell := range farewells {
if farewell.Language == language {
return farewell, nil
}
}

return nil, fmt.Errorf("no farewell found for language '%s'", language)
}
Loading