package holiday import ( "bytes" "encoding/csv" "encoding/xml" "fmt" "github.com/google/uuid" "strconv" "time" ) type DateResponse struct{ time.Time } func (d DateResponse) MarshalJSON() ([]byte, error) { return []byte("\"" + d.String() + "\""), nil } func (d DateResponse) String() string { return fmt.Sprintf(`%04d-%02d-%02d`, d.Year(), d.Month(), d.Day()) } type ErrorResponse struct { XMLName xml.Name `json:"-" xml:"Error"` Created time.Time `json:"created" xml:"created"` Message string `json:"message" xml:"message"` Code int `json:"-" xml:"-"` } type HolidayResponse struct { XMLName xml.Name `json:"-" xml:"Holidays"` Holidays []HolidayItemResponse `json:"holidays"` } func (h HolidayResponse) CSV() []byte { buffer := bytes.Buffer{} csvWriter := csv.NewWriter(&buffer) csvWriter.Write([]string{"id", "date", "name", "description", "isStateHoliday", "isReligiousHoliday"}) for _, item := range h.Holidays { csvWriter.Write([]string{item.Id.String(), item.Date.String(), item.Name, item.Description, strconv.FormatBool(item.IsStateHoliday), strconv.FormatBool(item.IsReligiousHoliday)}) } csvWriter.Flush() return buffer.Bytes() } type HolidayItemResponse struct { XMLName xml.Name `json:"-" xml:"Holiday"` Id uuid.UUID `json:"id" xml:"id,attr"` Date DateResponse `json:"date" xml:"date,attr"` Name string `json:"name" xml:"name"` Description string `json:"description" xml:"description,omitempty"` IsStateHoliday bool `json:"isStateHoliday" xml:"isState,attr"` IsReligiousHoliday bool `json:"isReligiousHoliday" xml:"isReligious,attr"` } func ToResponse(holidays []Holiday) HolidayResponse { var response = make([]HolidayItemResponse, 0, len(holidays)) for _, h := range holidays { response = append(response, HolidayItemResponse{ Id: h.Id, Date: DateResponse{h.Date}, Name: h.Name, Description: h.Description, IsStateHoliday: h.IsStateHoliday, IsReligiousHoliday: h.IsReligiousHoliday, }) } return HolidayResponse{ Holidays: response, } }