You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: project_deploy.go
    path of file: ./repos/graphql-engine/cli/pkg/deploy
    
    the code of the file until where you have to start completion: package deploy

import (
	"fmt"
	"io"

	"github.com/hasura/graphql-engine/cli/v2"
	"github.com/hasura/graphql-engine/cli/v2/internal/errors"
	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
)

type ProjectDeploy struct {
	ec *cli.ExecutionContext
}

type ProjectDeployOption func(deploy *ProjectDeploy)

func (p *ProjectDeploy) Deploy(opts ...ProjectDeployExecutorOptions) error {
	var
    
func NewProjectDeploy(projectDirectory string, opts ...ProjectDeployOption) (*ProjectDeploy, error) {
	var op errors.Op = "deploy.NewProjectDeploy"
	ec := cli.NewExecutionContext()
	ec.ExecutionDirectory = projectDirectory
	ec.Viper = viper.New()
	ec.IsTerminal = false
	ec.Stdout = io.Discard
	ec.Stderr = io.Discard

	if err := ec.Prepare(); err != nil {
		return nil, errors.E(op, err)
	}
	d := &ProjectDeploy{ec}
	for _, opt := range opts {
		opt(d)
	}

	if err := ec.Validate(); err != nil {
		return nil, errors.E(op, err)
	}
	if ec.Config.Version <= cli.V1 {
		return nil, errors.E(op, fmt.Errorf("config %v is not supported", ec.Config.Version))
	}
	return d, nil
}