func()

in internal/pkg/term/selector/selector.go [461:558]


func (s *DeploySelect) DeployedService(msg, help string, app string, opts ...GetDeployedServiceOpts) (*DeployedService, error) {
	for _, opt := range opts {
		opt(s)
	}
	var err error
	var envNames []string
	svcTypes := map[string]string{}

	// ServiceType is only utilized by the filtering functionality. No need to retrieve types if filters are not being applied
	if len(s.filters) > 0 {
		services, err := s.config.ListServices(app)
		if err != nil {
			return nil, fmt.Errorf("list services: %w", err)
		}
		for _, svc := range services {
			svcTypes[svc.Name] = svc.Type
		}
	}

	if s.env != "" {
		envNames = append(envNames, s.env)
	} else {
		envNames, err = s.retrieveEnvironments(app)
		if err != nil {
			return nil, fmt.Errorf("list environments: %w", err)
		}
	}
	svcEnvs := []*DeployedService{}
	for _, envName := range envNames {
		var svcNames []string
		if s.svc != "" {
			deployed, err := s.deployStoreSvc.IsServiceDeployed(app, envName, s.svc)
			if err != nil {
				return nil, fmt.Errorf("check if service %s is deployed in environment %s: %w", s.svc, envName, err)
			}
			if !deployed {
				continue
			}
			svcNames = append(svcNames, s.svc)
		} else {
			svcNames, err = s.deployStoreSvc.ListDeployedServices(app, envName)
			if err != nil {
				return nil, fmt.Errorf("list deployed service for environment %s: %w", envName, err)
			}
		}
		for _, svcName := range svcNames {
			svcEnv := &DeployedService{
				Svc:     svcName,
				Env:     envName,
				SvcType: svcTypes[svcName],
			}
			svcEnvs = append(svcEnvs, svcEnv)
		}
	}
	if len(svcEnvs) == 0 {
		return nil, fmt.Errorf("no deployed services found in application %s", color.HighlightUserInput(app))
	}

	if svcEnvs, err = s.filterServices(svcEnvs); err != nil {
		return nil, err
	}

	if len(svcEnvs) == 0 {
		return nil, fmt.Errorf("no matching deployed services found in application %s", color.HighlightUserInput(app))
	}
	// return if only one deployed service found
	var deployedSvc *DeployedService
	if len(svcEnvs) == 1 {
		deployedSvc = svcEnvs[0]
		if s.svc == "" && s.env == "" {
			log.Infof("Found only one deployed service %s in environment %s\n", color.HighlightUserInput(deployedSvc.Svc), color.HighlightUserInput(deployedSvc.Env))
		}
		if (s.svc != "") != (s.env != "") {
			log.Infof("Service %s found in environment %s\n", color.HighlightUserInput(deployedSvc.Svc), color.HighlightUserInput(deployedSvc.Env))
		}
		return deployedSvc, nil
	}

	svcEnvNames := make([]string, len(svcEnvs))
	svcEnvNameMap := map[string]*DeployedService{}
	for i, svc := range svcEnvs {
		svcEnvNames[i] = svc.String()
		svcEnvNameMap[svcEnvNames[i]] = svc
	}

	svcEnvName, err := s.prompt.SelectOne(
		msg,
		help,
		svcEnvNames,
		prompt.WithFinalMessage(deployedSvcFinalMsg),
	)
	if err != nil {
		return nil, fmt.Errorf("select deployed services for application %s: %w", app, err)
	}
	deployedSvc = svcEnvNameMap[svcEnvName]

	return deployedSvc, nil
}