mirror of
https://github.com/Luzifer/go-holidays.git
synced 2024-12-25 21:31:17 +00:00
69 lines
1.5 KiB
Go
69 lines
1.5 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"os"
|
||
|
"strconv"
|
||
|
"time"
|
||
|
|
||
|
holidays "github.com/Luzifer/go-holidays"
|
||
|
"github.com/Luzifer/rconfig"
|
||
|
"github.com/gorilla/mux"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
cfg = struct {
|
||
|
Listen string `flag:"listen" default:":3000" description:"IP/Port to listen on"`
|
||
|
VersionAndExit bool `flag:"version" default:"false" description:"Prints current version and exits"`
|
||
|
}{}
|
||
|
|
||
|
version = "dev"
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
if err := rconfig.Parse(&cfg); err != nil {
|
||
|
log.Fatalf("Unable to parse commandline options: %s", err)
|
||
|
}
|
||
|
|
||
|
if cfg.VersionAndExit {
|
||
|
fmt.Printf("holiday-api %s\n", version)
|
||
|
os.Exit(0)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
r := mux.NewRouter()
|
||
|
r.HandleFunc("/{country-code:[a-z-]+}/{year:[0-9]{4}}", handleHolidays)
|
||
|
r.HandleFunc("/{country-code:[a-z-]+}", handleHolidays)
|
||
|
http.ListenAndServe(cfg.Listen, r)
|
||
|
}
|
||
|
|
||
|
func handleHolidays(res http.ResponseWriter, r *http.Request) {
|
||
|
vars := mux.Vars(r)
|
||
|
|
||
|
var (
|
||
|
countryCode = vars["country-code"]
|
||
|
year = time.Now().Year()
|
||
|
)
|
||
|
|
||
|
if y, ok := vars["year"]; ok {
|
||
|
var err error
|
||
|
if year, err = strconv.Atoi(y); err != nil {
|
||
|
http.Error(res, "You need to specify the year as a 4 character number", http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
holidays, err := holidays.GetHolidays(countryCode, year)
|
||
|
if err != nil {
|
||
|
http.Error(res, "An error ocurred: "+err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
res.Header().Set("Content-Type", "application/json")
|
||
|
json.NewEncoder(res).Encode(holidays)
|
||
|
}
|