47 lines
1.4 KiB
Go
47 lines
1.4 KiB
Go
package calendarops
|
|
|
|
import (
|
|
"errors"
|
|
|
|
basetypes "code.apps.glenux.net/glenux/kiwimix/pkg/basetypes"
|
|
)
|
|
|
|
// DifferenceCalendarOperation is an operation that substract a calendar from
|
|
// another
|
|
type DifferenceCalendarOperation struct{}
|
|
|
|
// Ensure DifferenceCalendarOperation implements CalendarOperation
|
|
var _ CalendarOperation = (*DifferenceCalendarOperation)(nil)
|
|
|
|
func (op *DifferenceCalendarOperation) Execute(calendars ...*basetypes.Calendar) (*basetypes.Calendar, error) {
|
|
// Check that two calendars are provided
|
|
if len(calendars) != 2 {
|
|
return &basetypes.Calendar{}, errors.New("difference operation requires exactly two calendars")
|
|
}
|
|
|
|
// Create a new calendar to store the difference
|
|
differenceCalendar := basetypes.NewCalendar()
|
|
|
|
// Iterate over the events in the first calendar
|
|
for _, event1 := range calendars[0].GetEvents() {
|
|
// Assume initially that the event is unique to the first calendar
|
|
isUnique := true
|
|
|
|
// Compare with the events in the second calendar
|
|
for _, event2 := range calendars[1].GetEvents() {
|
|
if event1.Equals(event2) {
|
|
// If the event is also in the second calendar, it is not unique
|
|
isUnique = false
|
|
break
|
|
}
|
|
}
|
|
|
|
// If the event is unique to the first calendar, add it to the difference calendar
|
|
if isUnique {
|
|
differenceCalendar.AddEvent(event1)
|
|
}
|
|
}
|
|
|
|
// Return the difference calendar
|
|
return differenceCalendar, nil
|
|
}
|