package accessctl import ( "errors" "fmt" ) // FilterNot wraps another Filter. If that filter matches, FilterNot does not // match, and vice-versa. type FilterNot struct { Filter Filter `yaml:"filter"` } var _ FilterInterface = FilterNot{} // MatchCommit implements the method for FilterInterface. func (f FilterNot) MatchCommit(req CommitRequest) error { fI, err := f.Filter.Interface() if err != nil { return fmt.Errorf("casting %+v to a FilterInterface: %w", f.Filter, err) } else if err := fI.MatchCommit(req); errors.As(err, new(ErrFilterNoMatch)) { return nil } else if err != nil { return err } return ErrFilterNoMatch{Err: errors.New("sub-filter did match")} } // TODO FilterAll // TODO FilterAny