@Override
    public Integer call() throws Exception {
        if (!CommandUtil.isInputValid(this)) {
            return ToolConstants.INVALID_INPUT_ERROR_CODE;
        }

        // Validate Service specs with schema
        if (!serviceSpecInputValidator.validate(serviceSpecsFiles)) {
            return ToolConstants.INVALID_INPUT_ERROR_CODE;
        }

        Map<String, File> serviceVsSpecFile = new HashMap<>();
        for (File serviceSpec : serviceSpecsFiles) {
            serviceVsSpecFile.put(ServiceSpecUtil.getServiceName(serviceSpec), serviceSpec);
        }

        // Construct EffectiveServiceSpec from ProfileArg & ServiceSpecFiles
        List<EffectiveServiceSpec> effectiveServiceSpecs = serviceSpecProcessor.process(profileArg, serviceSpecsFiles);

        List<WorkflowContext> contextList = new ArrayList<>();
        for (EffectiveServiceSpec each : effectiveServiceSpecs) {
            if (each != null && each.getServiceSpec() != null && each.getServiceMetadata() != null) {
                WorkflowContextBuilder builder = new WorkflowContextBuilder(appName);
                try {
                    builder.withProfile(each.getServiceMetadata().getEnvName());
                    builder.withService(each.getServiceSpec());
                    contextList.add(builder.get());
                } catch (HyscaleException e) {
                    logger.error("Error while preparing workflow context ",e);
                    throw e;
                }
            }
        }

        postValidators.forEach(each -> inputSpecPostValidator.addValidator(each));

        if (!inputSpecPostValidator.validate(contextList)) {
            return ToolConstants.INVALID_INPUT_ERROR_CODE;
        }

        boolean isFailed = false;
        for (WorkflowContext workflowContext : contextList) {
            isFailed = !executeInvoker(serviceVsSpecFile, workflowContext) || isFailed;
        }

        return isFailed ? ToolConstants.HYSCALE_ERROR_CODE : 0;
    }
This class executes 'hyscale generate service manifests' command
It is a sub-command of the 'hyscale generate service' command

Options:
 appName - name of the app
 serviceSpecs - list of service specs
 profiles - list of profiles for services
 profile - profile name to look for. Profile file should be present for all services in service spec (profiles and profile are mutually exclusive)
<p>
Eg 1: hyscale generate service manifests -f svc.hspec -f svcb.hspec -p dev-svc.hprof -a sample
Eg 2: hyscale generate service manifests -f svc.hspec -P dev -a sample
<p>
Performs a validation of input before starting manifest generation.
Generates the manifests from the given hspec and writes the manifests
to  {@literal<USER.HOME>}/hyscale/apps/{@literal<appName>}/{@literal<serviceName>}/generated-files/manifests/
@see HyscaleGenerateServiceCommand
Every command/sub-command has to implement the Runnable so that
whenever the command is executed the {@link #call()}
method will be invoked
workflow-controller/controller-service/src/main/java/io/hyscale/controller/commands/generate/HyscaleGenerateServiceManifestsCommand.java