pkg/event/frameworkevent/framework.go (71 lines of code) (raw):

// Copyright (c) Facebook, Inc. and its affiliates. // // This source code is licensed under the MIT license found in the // LICENSE file in the root directory of this source tree. package frameworkevent import ( "encoding/json" "fmt" "time" "github.com/facebookincubator/contest/pkg/event" "github.com/facebookincubator/contest/pkg/event/internal/querytools" "github.com/facebookincubator/contest/pkg/types" "github.com/facebookincubator/contest/pkg/xcontext" ) // Event represents an event emitted by the framework type Event struct { JobID types.JobID EventName event.Name Payload *json.RawMessage EmitTime time.Time } // New creates a new FrameworkEvent func New() Event { return Event{} } // Query wraps information that are used to build event queries for framework events type Query struct { event.Query } // QueryField defines a function type used to set a field's value on Query objects type QueryField interface { queryFieldPointer(query *Query) interface{} } // QueryFields is a set of field values for a Query object type QueryFields []QueryField // BuildQuery compiles a Query from scratch using values of queryFields. // It does basically just creates an empty query an applies queryFields to it. func (queryFields QueryFields) BuildQuery() (*Query, error) { query := &Query{} for _, queryField := range queryFields { if err := querytools.ApplyQueryField(queryField.queryFieldPointer(query), queryField); err != nil { return nil, fmt.Errorf("unable to apply field %T(%v): %w", queryField, queryField, err) } } return query, nil } // BuildQuery compiles a Query from scratch using values of queryFields. // It does basically just creates an empty query an applies queryFields to it. func BuildQuery(queryFields ...QueryField) (*Query, error) { return QueryFields(queryFields).BuildQuery() } type queryFieldJobID types.JobID type queryFieldEventNames []event.Name type queryFieldEmittedStartTime time.Time type queryFieldEmittedEndTime time.Time // QueryJobID sets the JobID field of the Query object func QueryJobID(jobID types.JobID) QueryField { return queryFieldJobID(jobID) } func (value queryFieldJobID) queryFieldPointer(query *Query) interface{} { return &query.JobID } // QueryEventNames the EventNames field of the Query object func QueryEventNames(eventNames []event.Name) QueryField { return queryFieldEventNames(eventNames) } func (value queryFieldEventNames) queryFieldPointer(query *Query) interface{} { return &query.EventNames } // QueryEventName sets a single EventName field in the Query object func QueryEventName(eventName event.Name) QueryField { return queryFieldEventNames{eventName} } // QueryEmittedStartTime sets the EmittedStartTime field of the Query object func QueryEmittedStartTime(emittedStartTime time.Time) QueryField { return queryFieldEmittedStartTime(emittedStartTime) } func (value queryFieldEmittedStartTime) queryFieldPointer(query *Query) interface{} { return &query.EmittedStartTime } // QueryEmittedEndTime sets the EmittedEndTime field of the Query object func QueryEmittedEndTime(emittedEndTime time.Time) QueryField { return queryFieldEmittedEndTime(emittedEndTime) } func (value queryFieldEmittedEndTime) queryFieldPointer(query *Query) interface{} { return &query.EmittedEndTime } // Emitter defines the interface that emitter objects for framework vents must implement type Emitter interface { Emit(ctx xcontext.Context, event Event) error } // Fetcher defines the interface that fetcher objects for framework events must implement type Fetcher interface { Fetch(ctx xcontext.Context, fields ...QueryField) ([]Event, error) } // EmitterFetcher defines the interface that objects supporting emitting and retrieving framework events must implement type EmitterFetcher interface { Emitter Fetcher }