feat: implement caldav search
This commit is contained in:
+87
@@ -0,0 +1,87 @@
|
||||
package components
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/dolanor/caldav-go/icalendar/values"
|
||||
"github.com/dolanor/caldav-go/utils"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Calendar struct {
|
||||
|
||||
// specifies the identifier corresponding to the highest version number or the minimum and maximum
|
||||
// range of the iCalendar specification that is required in order to interpret the iCalendar object.
|
||||
Version string `ical:",2.0"`
|
||||
|
||||
// specifies the identifier for the product that created the iCalendar object
|
||||
ProductId string `ical:"prodid,-//dolanor/caldav-go//NONSGML v1.0.0//EN"`
|
||||
|
||||
// specifies the text value that uniquely identifies the "VTIMEZONE" calendar component.
|
||||
TimeZoneId string `ical:"tzid,omitempty"`
|
||||
|
||||
// defines the iCalendar object method associated with the calendar object.
|
||||
Method values.Method `ical:",omitempty"`
|
||||
|
||||
// defines the calendar scale used for the calendar information specified in the iCalendar object.
|
||||
CalScale values.CalScale `ical:",omitempty"`
|
||||
|
||||
// defines the different timezones used by the various components nested within
|
||||
TimeZones []*TimeZone `ical:",omitempty"`
|
||||
|
||||
// unique events to be stored together in the icalendar file
|
||||
Events []*Event `ical:",omitempty"`
|
||||
}
|
||||
|
||||
func (c *Calendar) UseTimeZone(location *time.Location) *TimeZone {
|
||||
tz := NewDynamicTimeZone(location)
|
||||
c.TimeZones = append(c.TimeZones, tz)
|
||||
c.TimeZoneId = tz.Id
|
||||
return tz
|
||||
}
|
||||
|
||||
func (c *Calendar) UsingTimeZone() bool {
|
||||
return len(c.TimeZoneId) > 0
|
||||
}
|
||||
|
||||
func (c *Calendar) UsingGlobalTimeZone() bool {
|
||||
return c.UsingTimeZone() && c.TimeZoneId[0] == '/'
|
||||
}
|
||||
|
||||
func (c *Calendar) ValidateICalValue() error {
|
||||
|
||||
for i, e := range c.Events {
|
||||
|
||||
if e == nil {
|
||||
continue // skip nil events
|
||||
}
|
||||
|
||||
if err := e.ValidateICalValue(); err != nil {
|
||||
msg := fmt.Sprintf("event %d failed validation", i)
|
||||
return utils.NewError(c.ValidateICalValue, msg, c, err)
|
||||
}
|
||||
|
||||
if e.DateStart == nil && c.Method == "" {
|
||||
msg := fmt.Sprintf("no value for method and no start date defined on event %d", i)
|
||||
return utils.NewError(c.ValidateICalValue, msg, c, nil)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if c.UsingTimeZone() && !c.UsingGlobalTimeZone() {
|
||||
for i, t := range c.TimeZones {
|
||||
if t == nil || t.Id != c.TimeZoneId {
|
||||
msg := fmt.Sprintf("timezone ID does not match timezone %d", i)
|
||||
return utils.NewError(c.ValidateICalValue, msg, c, nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func NewCalendar(events ...*Event) *Calendar {
|
||||
cal := new(Calendar)
|
||||
cal.Events = events
|
||||
return cal
|
||||
}
|
||||
Reference in New Issue
Block a user