mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-05 09:14:28 +00:00
64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
|
package verification
|
||
|
|
||
|
// Requirement represents a validation check that needs to pass in order for a Verified form a consensus type to be issued.
|
||
|
type Requirement int
|
||
|
|
||
|
// results collects positive verification results.
|
||
|
// This bitmap can be used to test which verifications have been successfully completed in order to
|
||
|
// decide whether it is safe to issue a "Verified" type variant.
|
||
|
type results struct {
|
||
|
done map[Requirement]error
|
||
|
reqs []Requirement
|
||
|
}
|
||
|
|
||
|
func newResults(reqs ...Requirement) *results {
|
||
|
return &results{done: make(map[Requirement]error, len(reqs)), reqs: reqs}
|
||
|
}
|
||
|
|
||
|
func (r *results) record(req Requirement, err error) {
|
||
|
r.done[req] = err
|
||
|
}
|
||
|
|
||
|
// allSatisfied returns true if there is a nil error result for every Requirement.
|
||
|
func (r *results) allSatisfied() bool {
|
||
|
if len(r.done) != len(r.reqs) {
|
||
|
return false
|
||
|
}
|
||
|
for i := range r.reqs {
|
||
|
err, ok := r.done[r.reqs[i]]
|
||
|
if !ok || err != nil {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
func (r *results) executed(req Requirement) bool {
|
||
|
_, ok := r.done[req]
|
||
|
return ok
|
||
|
}
|
||
|
|
||
|
func (r *results) result(req Requirement) error {
|
||
|
return r.done[req]
|
||
|
}
|
||
|
|
||
|
func (r *results) errors(err error) error {
|
||
|
return newVerificationMultiError(r, err)
|
||
|
}
|
||
|
|
||
|
func (r *results) failures() map[Requirement]error {
|
||
|
fail := make(map[Requirement]error, len(r.done))
|
||
|
for i := range r.reqs {
|
||
|
req := r.reqs[i]
|
||
|
err, ok := r.done[req]
|
||
|
if !ok {
|
||
|
fail[req] = ErrMissingVerification
|
||
|
continue
|
||
|
}
|
||
|
if err != nil {
|
||
|
fail[req] = err
|
||
|
}
|
||
|
}
|
||
|
return fail
|
||
|
}
|