github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/core/quota/multichecker.go (about)

     1  // Copyright 2020 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package quota
     5  
     6  // Checker is implemented by types that can perform quota limit checks.
     7  type Checker interface {
     8  	Check(interface{})
     9  	Outcome() error
    10  }
    11  
    12  var _ Checker = (*MultiChecker)(nil)
    13  
    14  // MultiChecker composes a list of individual Checker instances.
    15  type MultiChecker struct {
    16  	checkers []Checker
    17  }
    18  
    19  // NewMultiChecker returns a Checker that composes the Check/Outcome logic for
    20  // the specified list of Checkers.
    21  func NewMultiChecker(checkers ...Checker) *MultiChecker {
    22  	return &MultiChecker{
    23  		checkers: checkers,
    24  	}
    25  }
    26  
    27  // Check passes v to the Check method for each one of the composed Checkers.
    28  func (c MultiChecker) Check(v interface{}) {
    29  	for _, checker := range c.checkers {
    30  		checker.Check(v)
    31  	}
    32  }
    33  
    34  // Outcome invokes Outcome on each composed Checker and returns back any
    35  // obtained error or nil if all checks succeeded.
    36  func (c MultiChecker) Outcome() error {
    37  	for _, checker := range c.checkers {
    38  		if err := checker.Outcome(); err != nil {
    39  			return err
    40  		}
    41  	}
    42  	return nil
    43  }