github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/runbits/requirements/rationalize.go (about)

     1  package requirements
     2  
     3  import (
     4  	"errors"
     5  
     6  	"github.com/ActiveState/cli/internal/errs"
     7  	"github.com/ActiveState/cli/internal/locale"
     8  	"github.com/ActiveState/cli/internal/runbits/rationalize"
     9  	bpResp "github.com/ActiveState/cli/pkg/platform/api/buildplanner/response"
    10  	"github.com/ActiveState/cli/pkg/platform/model"
    11  )
    12  
    13  func (r *RequirementOperation) rationalizeError(err *error) {
    14  	var tooManyMatchesErr *model.ErrTooManyMatches
    15  	var noMatchesErr *ErrNoMatches
    16  	var buildPlannerErr *bpResp.BuildPlannerError
    17  	var resolveNamespaceErr *ResolveNamespaceError
    18  
    19  	switch {
    20  	case err == nil:
    21  		return
    22  
    23  	// Too many matches
    24  	case errors.As(*err, &tooManyMatchesErr):
    25  		*err = errs.WrapUserFacing(*err,
    26  			locale.Tr("err_searchingredient_toomany", tooManyMatchesErr.Query),
    27  			errs.SetInput())
    28  
    29  	// No matches, and no alternate suggestions
    30  	case errors.As(*err, &noMatchesErr) && noMatchesErr.Alternatives == nil:
    31  		*err = errs.WrapUserFacing(*err,
    32  			locale.Tr("package_ingredient_alternatives_nosuggest", noMatchesErr.Query),
    33  			errs.SetInput())
    34  
    35  	// No matches, but have alternate suggestions
    36  	case errors.As(*err, &noMatchesErr) && noMatchesErr.Alternatives != nil:
    37  		*err = errs.WrapUserFacing(*err,
    38  			locale.Tr("package_ingredient_alternatives", noMatchesErr.Query, *noMatchesErr.Alternatives),
    39  			errs.SetInput())
    40  
    41  	// We communicate buildplanner errors verbatim as the intend is that these are curated by the buildplanner
    42  	case errors.As(*err, &buildPlannerErr):
    43  		*err = errs.WrapUserFacing(*err,
    44  			buildPlannerErr.LocalizedError(),
    45  			errs.SetIf(buildPlannerErr.InputError(), errs.SetInput()))
    46  
    47  	// Headless
    48  	case errors.Is(*err, rationalize.ErrHeadless):
    49  		*err = errs.WrapUserFacing(*err,
    50  			locale.Tl(
    51  				"err_requirement_headless",
    52  				"Cannot update requirements for a headless project. Please visit {{.V0}} to convert your project and try again.",
    53  				r.Project.URL(),
    54  			),
    55  			errs.SetInput())
    56  
    57  	case errors.Is(*err, errNoRequirements):
    58  		*err = errs.WrapUserFacing(*err,
    59  			locale.Tl("err_no_requirements",
    60  				"No requirements have been provided for this operation.",
    61  			),
    62  			errs.SetInput(),
    63  		)
    64  
    65  	case errors.As(*err, &resolveNamespaceErr):
    66  		*err = errs.WrapUserFacing(*err,
    67  			locale.Tl("err_resolve_namespace",
    68  				"Could not resolve namespace for requirement '{{.V0}}'.",
    69  				resolveNamespaceErr.Name,
    70  			),
    71  			errs.SetInput(),
    72  		)
    73  
    74  	case errors.Is(*err, errInitialNoRequirement):
    75  		*err = errs.WrapUserFacing(*err,
    76  			locale.T("err_initial_no_requirement"),
    77  			errs.SetInput(),
    78  		)
    79  
    80  	}
    81  }