You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
1.6 KiB
Go
86 lines
1.6 KiB
Go
package prayer
|
|
|
|
import (
|
|
"context"
|
|
"database/sql/driver"
|
|
"encoding/json"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
var ErrInvalidLocation = errors.New("invalid location")
|
|
|
|
type TimesProvider interface {
|
|
Get(ctx context.Context, location string) ([]Times, error)
|
|
Name() string
|
|
}
|
|
|
|
type Coordinates struct {
|
|
Latitude float64
|
|
Longitude float64
|
|
}
|
|
|
|
type LocationTimesProvider interface {
|
|
GetByCoords(ctx context.Context, coords Coordinates) ([]Times, error)
|
|
Name() string
|
|
}
|
|
|
|
type Date time.Time
|
|
|
|
func (d Date) String() string {
|
|
return time.Time(d).Format(time.DateOnly)
|
|
}
|
|
|
|
func (d *Date) Scan(src any) error {
|
|
switch v := src.(type) {
|
|
case []byte:
|
|
return json.Unmarshal(v, d)
|
|
case string:
|
|
return json.Unmarshal([]byte(v), d)
|
|
case time.Time:
|
|
*d = Date(v)
|
|
return nil
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (d *Date) Value() (driver.Value, error) {
|
|
return json.Marshal(d)
|
|
}
|
|
|
|
func (d *Date) UnmarshalJSON(bytes []byte) error {
|
|
var t time.Time
|
|
if err := json.Unmarshal(bytes, &t); err != nil {
|
|
return err
|
|
}
|
|
_, offset := t.Zone()
|
|
t = t.Add(time.Duration(offset * int(time.Second)))
|
|
t = t.UTC()
|
|
*d = Date(t)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (d Date) MarshalJSON() ([]byte, error) {
|
|
t := time.Time(d)
|
|
return json.Marshal(t.Format(time.DateOnly))
|
|
}
|
|
|
|
func (d Date) Time() time.Time {
|
|
t := time.Time(d)
|
|
_, offset := t.Zone()
|
|
t = t.Add(time.Duration(offset * int(time.Second)))
|
|
t = t.UTC()
|
|
return t
|
|
}
|
|
|
|
type Times struct {
|
|
Date string `json:"date"`
|
|
Fajr string `json:"fajr"`
|
|
Sunrise string `json:"sunrise"`
|
|
Dhuhr string `json:"dhuhr"`
|
|
Asr string `json:"asr"`
|
|
Maghrib string `json:"maghrib"`
|
|
Isha string `json:"isha"`
|
|
}
|