mirror of
https://github.com/Xevion/go-ha.git
synced 2025-12-06 15:15:14 -06:00
add enable/disable function to every builder
This commit is contained in:
83
interval.go
83
interval.go
@@ -18,6 +18,13 @@ type Interval struct {
|
||||
|
||||
exceptionDates []time.Time
|
||||
exceptionRanges []timeRange
|
||||
|
||||
enabledEntity string
|
||||
enabledEntityState string
|
||||
enabledEntityRunOnError bool
|
||||
disabledEntity string
|
||||
disabledEntityState string
|
||||
disabledEntityRunOnError bool
|
||||
}
|
||||
|
||||
func (i Interval) Hash() string {
|
||||
@@ -69,38 +76,72 @@ func formatStartOrEndString(s TimeString, isStart bool) string {
|
||||
}
|
||||
}
|
||||
|
||||
func (sb intervalBuilder) Call(callback IntervalCallback) intervalBuilderCall {
|
||||
sb.interval.callback = callback
|
||||
return intervalBuilderCall(sb)
|
||||
func (ib intervalBuilder) Call(callback IntervalCallback) intervalBuilderCall {
|
||||
ib.interval.callback = callback
|
||||
return intervalBuilderCall(ib)
|
||||
}
|
||||
|
||||
// Takes a DurationString ("2h", "5m", etc) to set the frequency of the interval.
|
||||
func (sb intervalBuilderCall) Every(s DurationString) intervalBuilderEnd {
|
||||
func (ib intervalBuilderCall) Every(s DurationString) intervalBuilderEnd {
|
||||
d := internal.ParseDuration(string(s))
|
||||
sb.interval.frequency = d
|
||||
return intervalBuilderEnd(sb)
|
||||
ib.interval.frequency = d
|
||||
return intervalBuilderEnd(ib)
|
||||
}
|
||||
|
||||
// Takes a TimeString ("HH:MM") when this interval will start running for the day.
|
||||
func (sb intervalBuilderEnd) StartingAt(s TimeString) intervalBuilderEnd {
|
||||
sb.interval.startTime = s
|
||||
return sb
|
||||
func (ib intervalBuilderEnd) StartingAt(s TimeString) intervalBuilderEnd {
|
||||
ib.interval.startTime = s
|
||||
return ib
|
||||
}
|
||||
|
||||
// Takes a TimeString ("HH:MM") when this interval will stop running for the day.
|
||||
func (sb intervalBuilderEnd) EndingAt(s TimeString) intervalBuilderEnd {
|
||||
sb.interval.endTime = s
|
||||
return sb
|
||||
func (ib intervalBuilderEnd) EndingAt(s TimeString) intervalBuilderEnd {
|
||||
ib.interval.endTime = s
|
||||
return ib
|
||||
}
|
||||
|
||||
func (sb intervalBuilderEnd) ExceptionDates(t time.Time, tl ...time.Time) intervalBuilderEnd {
|
||||
sb.interval.exceptionDates = append(tl, t)
|
||||
return sb
|
||||
func (ib intervalBuilderEnd) ExceptionDates(t time.Time, tl ...time.Time) intervalBuilderEnd {
|
||||
ib.interval.exceptionDates = append(tl, t)
|
||||
return ib
|
||||
}
|
||||
|
||||
func (sb intervalBuilderEnd) ExceptionRange(start, end time.Time) intervalBuilderEnd {
|
||||
sb.interval.exceptionRanges = append(sb.interval.exceptionRanges, timeRange{start, end})
|
||||
return sb
|
||||
func (ib intervalBuilderEnd) ExceptionRange(start, end time.Time) intervalBuilderEnd {
|
||||
ib.interval.exceptionRanges = append(ib.interval.exceptionRanges, timeRange{start, end})
|
||||
return ib
|
||||
}
|
||||
|
||||
/*
|
||||
Enable this interval only when the current state of {entityId} matches {state}.
|
||||
If there is a network error while retrieving state, the interval runs if {runOnNetworkError} is true.
|
||||
*/
|
||||
func (ib intervalBuilderEnd) EnabledEntity(entityId, state string, runOnNetworkError bool) intervalBuilderEnd {
|
||||
if entityId == "" || state == "" {
|
||||
panic(fmt.Sprintf("Either entityId or state is empty in EnabledEntity entityId='%s' state='%s'", entityId, state))
|
||||
}
|
||||
if ib.interval.enabledEntity != "" {
|
||||
panic(fmt.Sprintf("You can't use EnabledEntity and DisabledEntity together. Error occurred while setting EnabledEntity on an entity listener with params entityId=%s state=%s runOnNetworkError=%t", entityId, state, runOnNetworkError))
|
||||
}
|
||||
ib.interval.enabledEntity = entityId
|
||||
ib.interval.enabledEntityState = state
|
||||
ib.interval.enabledEntityRunOnError = runOnNetworkError
|
||||
return ib
|
||||
}
|
||||
|
||||
/*
|
||||
Disable this interval when the current state of {entityId} matches {state}.
|
||||
If there is a network error while retrieving state, the interval runs if {runOnNetworkError} is true.
|
||||
*/
|
||||
func (ib intervalBuilderEnd) DisabledEntity(entityId, state string, runOnNetworkError bool) intervalBuilderEnd {
|
||||
if entityId == "" || state == "" {
|
||||
panic(fmt.Sprintf("Either entityId or state is empty in EnabledEntity entityId='%s' state='%s'", entityId, state))
|
||||
}
|
||||
if ib.interval.enabledEntity != "" {
|
||||
panic(fmt.Sprintf("You can't use EnabledEntity and DisabledEntity together. Error occurred while setting DisabledEntity on an entity listener with params entityId=%s state=%s runOnNetworkError=%t", entityId, state, runOnNetworkError))
|
||||
}
|
||||
ib.interval.disabledEntity = entityId
|
||||
ib.interval.disabledEntityState = state
|
||||
ib.interval.disabledEntityRunOnError = runOnNetworkError
|
||||
return ib
|
||||
}
|
||||
|
||||
func (sb intervalBuilderEnd) Build() Interval {
|
||||
@@ -143,6 +184,12 @@ func (i Interval) maybeRunCallback(a *App) {
|
||||
if c := checkExceptionRanges(i.exceptionRanges); c.fail {
|
||||
return
|
||||
}
|
||||
if c := checkEnabledEntity(a.state, i.enabledEntity, i.enabledEntityState, i.enabledEntityRunOnError); c.fail {
|
||||
return
|
||||
}
|
||||
if c := checkDisabledEntity(a.state, i.disabledEntity, i.disabledEntityState, i.disabledEntityRunOnError); c.fail {
|
||||
return
|
||||
}
|
||||
go i.callback(a.service, a.state)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user