pub struct TaskEventsRuleFilter {
pub target: Option<String>,
pub min_level: Option<Level>,
pub field_filters: Vec<FieldPredicate>,
}Expand description
Parsed predicate from a task-events:<expr> rule check field.
Semantics: after the verify TaskRun completes,
call task.events with these params. Any match means the rule is violated.
§Grammar
expr := [target] (WS field-pred)*
target := word-without-'=' e.g. "cargo::rustc"
field-pred := key '=' scalar-value
key := "level" | "min_level" special: parsed as Level
| dotted-path e.g. "error.code", "file.path"
scalar := bare-number | "true" | "false" | bare-string§Examples
"task-events:cargo::rustc error.code=E0308"
→ target: cargo::rustc, field: error.code == "E0308"
"task-events:clippy::warning level=error"
→ target: clippy::warning, min_level: Error
"task-events:cargo::rustc"
→ target: cargo::rustc, any level, any fieldFields§
§target: Option<String>Event target prefix, e.g. "cargo::rustc" or "clippy::warning".
When set, the evaluator passes this as the target param to
task.events, which does a prefix match. None means any target.
min_level: Option<Level>Minimum severity to include. None defaults to warn at the
call site so rule checks don’t fire on debug/trace noise.
field_filters: Vec<FieldPredicate>Field equality predicates. The evaluator ANDs them: all must match.
Implementations§
Source§impl TaskEventsRuleFilter
impl TaskEventsRuleFilter
Sourcepub fn matches_fields(&self, fields: &Value) -> bool
pub fn matches_fields(&self, fields: &Value) -> bool
Returns true when all field predicates match the given event fields
JSON object. An empty field_filters list always returns true.
The gnome verify pass calls this after fetching events via task.events
(which already pre-filters by target and min_level). The combined
protocol is:
- Call
task.events(run_id, target=filter.target, min_level=...). - For each returned event, call
filter.matches_fields(&event.fields). - If any event passes → rule violated; if none pass → satisfied.
This client-side pass is necessary because task.events only supports
a single jsonpath server-side filter; AND-ing multiple field predicates
is done here.
Sourcepub fn parse(expr: &str) -> Result<Self, ParseError>
pub fn parse(expr: &str) -> Result<Self, ParseError>
Parse the part of a rule check string after stripping "task-events:".
Returns Err if any token fails to parse (e.g. malformed key=value).
Sourcepub fn parse_check_field(check: &str) -> Result<Self, ParseError>
pub fn parse_check_field(check: &str) -> Result<Self, ParseError>
Parse a full task-events:<expr> string (including the prefix).
Trait Implementations§
Source§impl Clone for TaskEventsRuleFilter
impl Clone for TaskEventsRuleFilter
Source§fn clone(&self) -> TaskEventsRuleFilter
fn clone(&self) -> TaskEventsRuleFilter
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for TaskEventsRuleFilter
impl Debug for TaskEventsRuleFilter
Source§impl<'de> Deserialize<'de> for TaskEventsRuleFilter
impl<'de> Deserialize<'de> for TaskEventsRuleFilter
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for TaskEventsRuleFilter
impl PartialEq for TaskEventsRuleFilter
Source§impl Serialize for TaskEventsRuleFilter
impl Serialize for TaskEventsRuleFilter
impl StructuralPartialEq for TaskEventsRuleFilter
Auto Trait Implementations§
impl Freeze for TaskEventsRuleFilter
impl RefUnwindSafe for TaskEventsRuleFilter
impl Send for TaskEventsRuleFilter
impl Sync for TaskEventsRuleFilter
impl Unpin for TaskEventsRuleFilter
impl UnsafeUnpin for TaskEventsRuleFilter
impl UnwindSafe for TaskEventsRuleFilter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<T> Fruit for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more