diff --git a/farewells.json b/farewells.json new file mode 100644 index 0000000..9c0389f --- /dev/null +++ b/farewells.json @@ -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": "వీడ్కోలు ప్రపంచం!" } +] diff --git a/main.go b/main.go index f3dd57c..b306f5f 100644 --- a/main.go +++ b/main.go @@ -16,11 +16,19 @@ 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) @@ -28,6 +36,14 @@ func main() { 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) { @@ -36,13 +52,45 @@ 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) @@ -50,8 +98,9 @@ func main() { 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) } @@ -74,10 +123,14 @@ func main() { } } -func FormatResponse(greeting *Greeting) string { +func FormatGreetingResponse(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") @@ -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) +}