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 }