48 lines
1.4 KiB
Go
48 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.SetEvent(event1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Return the difference calendar
|
||
|
return differenceCalendar, nil
|
||
|
}
|