You've already forked drone-email
							
							
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			
		
			
				
	
	
		
			584 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			584 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package cmd
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"git.cryptic.systems/volker.raschek/drone-email-docker/pkg/domain"
 | 
						|
	"git.cryptic.systems/volker.raschek/drone-email-docker/pkg/flags"
 | 
						|
	"git.cryptic.systems/volker.raschek/drone-email-docker/pkg/mail"
 | 
						|
	"github.com/spf13/cobra"
 | 
						|
	"github.com/spf13/pflag"
 | 
						|
	"github.com/spf13/viper"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	// The name of our config file, without the file extension because viper
 | 
						|
	// supports many different config file languages.
 | 
						|
	defaultConfigFilename  = "config"
 | 
						|
	defaultConfigExtension = "yaml"
 | 
						|
 | 
						|
	// The environment variable prefix of all environment variables bound to our command line flags.
 | 
						|
	// For example, --number is bound to STING_NUMBER.
 | 
						|
	envPrefix = ""
 | 
						|
)
 | 
						|
 | 
						|
func Execute(version string) error {
 | 
						|
	rootCmd := &cobra.Command{
 | 
						|
		Use: "drone-email",
 | 
						|
		PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
 | 
						|
			return initializeConfig(cmd)
 | 
						|
		},
 | 
						|
		RunE: func(cmd *cobra.Command, args []string) error {
 | 
						|
			vars, err := newHTMLTemplateVarsByCommand(cmd)
 | 
						|
			if err != nil {
 | 
						|
				return fmt.Errorf("failed to initialize new html template vars: %w", err)
 | 
						|
			}
 | 
						|
 | 
						|
			smtpSettings, err := newSMTPSettingsByCommand(cmd)
 | 
						|
			if err != nil {
 | 
						|
				return fmt.Errorf("failed to initialize new config vars: %w", err)
 | 
						|
			}
 | 
						|
 | 
						|
			recipients, err := cmd.Flags().GetStringArray(flags.SMTP_TO_ADDRESSES)
 | 
						|
			if err != nil {
 | 
						|
				return fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_TO_ADDRESSES, err)
 | 
						|
			}
 | 
						|
 | 
						|
			err = mail.NewPlugin(smtpSettings).Exec(cmd.Context(), recipients, vars)
 | 
						|
			if err != nil {
 | 
						|
				return fmt.Errorf("failed to execute mail plugin: %w", err)
 | 
						|
			}
 | 
						|
 | 
						|
			_, err = fmt.Fprint(os.Stdout, "E-Mails successfully sent")
 | 
						|
			if err != nil {
 | 
						|
				return fmt.Errorf("failed to write message on stdout: %w", err)
 | 
						|
			}
 | 
						|
 | 
						|
			return nil
 | 
						|
		},
 | 
						|
		SilenceUsage: true,
 | 
						|
		Version:      version,
 | 
						|
	}
 | 
						|
 | 
						|
	hostname, err := os.Hostname()
 | 
						|
	if err != nil {
 | 
						|
		return fmt.Errorf("failed to detect hostname: %w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	// Drone environment variables/flags
 | 
						|
	// Flags which receive their values from environment variables of the drone
 | 
						|
	// CI/CD.
 | 
						|
	//
 | 
						|
	// The names of the FLags must match the environment variables, otherwise the
 | 
						|
	// environment variables will not be bound correctly to the flags.
 | 
						|
	rootCmd.Flags().Int64(flags.DRONE_BUILD_CREATED, 0, "Build created")
 | 
						|
	rootCmd.Flags().Int64(flags.DRONE_BUILD_FINISHED, 0, "Build finished")
 | 
						|
	rootCmd.Flags().Int64(flags.DRONE_BUILD_STARTED, 0, "Build stared")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_BUILD_EVENT, "push", "Build event")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_BUILD_LINK, "", "Build link")
 | 
						|
	rootCmd.Flags().Int(flags.DRONE_BUILD_NUMBER, 0, "Build number")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_BUILD_STATUS, "success", "Build status")
 | 
						|
 | 
						|
	rootCmd.Flags().String(flags.DRONE_COMMIT_SHA, "", "SHA sum of the commit")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_COMMIT_REF, "refs/heads/master", "Commit reference")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_COMMIT_BRANCH, "master", "Commit branch")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_COMMIT_LINK, "", "Link to the commit")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_COMMIT_MESSAGE, "", "Commit message")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_COMMIT_AUTHOR_NAME, "", "Name of the commit author")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_COMMIT_AUTHOR_EMAIL, "", "E-Mail of the commit author")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_COMMIT_AUTHOR_AVATAR, "", "Avatar of the commit author")
 | 
						|
 | 
						|
	rootCmd.Flags().String(flags.DRONE_DEPLOY_TO, "", "Deploy target")
 | 
						|
 | 
						|
	rootCmd.Flags().String(flags.DRONE_JOB_NUMBER, "", "Job number")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_JOB_STATUS, "", "Job status")
 | 
						|
	rootCmd.Flags().Int(flags.DRONE_JOB_EXIT_CODE, 0, "Job exit code")
 | 
						|
	rootCmd.Flags().Int(flags.DRONE_JOB_STARTED, 0, "Job started")
 | 
						|
	rootCmd.Flags().Int(flags.DRONE_JOB_FINISHED, 0, "Job finished")
 | 
						|
 | 
						|
	rootCmd.Flags().String(flags.DRONE_PREV_BUILD_STATUS, "", "Previous build status")
 | 
						|
	rootCmd.Flags().Int(flags.DRONE_PREV_BUILD_NUMBER, 0, "Previous build number")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_PREV_COMMIT_SHA, "", "Previous commit sha sum")
 | 
						|
 | 
						|
	rootCmd.Flags().Int(flags.DRONE_PULL_REQUEST, 0, "Number of pull-request")
 | 
						|
 | 
						|
	rootCmd.Flags().String(flags.DRONE_REMOTE_URL, "", "Clone URL of the repository")
 | 
						|
 | 
						|
	rootCmd.Flags().Bool(flags.DRONE_REPO_PRIVATE, true, "Repository is private")
 | 
						|
	rootCmd.Flags().Bool(flags.DRONE_REPO_TRUSTED, false, "Repository is trusted")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_REPO_AVATAR, "", "Avatar URL of the repository")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_REPO_BRANCH, "master", "Branch of the repository")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_REPO_LINK, "", "URL to the repository")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_REPO_NAME, "", "Name of the repository")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_REPO_OWNER, "", "Name of the repository owner")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_REPO_SCM, "git", "Source code management provider")
 | 
						|
	rootCmd.Flags().String(flags.DRONE_REPO, "", "Full name of the repository")
 | 
						|
 | 
						|
	rootCmd.Flags().String(flags.DRONE_TAG, "", "Tag")
 | 
						|
 | 
						|
	rootCmd.Flags().Bool(flags.DRONE_YAML_SIGNED, false, "YAML is signed")
 | 
						|
	rootCmd.Flags().Bool(flags.DRONE_YAML_VERIFIED, false, "YAML is verified")
 | 
						|
 | 
						|
	// MAIL SETTINGS
 | 
						|
	rootCmd.Flags().Bool(flags.SMTP_START_TLS, mail.DefaultSMTPStartTLS, "Use StartTLS instead of SSL")
 | 
						|
	rootCmd.Flags().Bool(flags.SMTP_TLS_INSECURE_SKIP_VERIFY, mail.DefaultSMTPTLSInsecureSkipVerify, "Trust insecure TLS certificates")
 | 
						|
	rootCmd.Flags().Int(flags.SMTP_PORT, mail.DefaultSMTPPort, "SMTP-Port")
 | 
						|
	rootCmd.Flags().String(flags.SMTP_FROM_ADDRESS, mail.DefaultSMTPFromAddress, "SMTP-From Address")
 | 
						|
	rootCmd.Flags().String(flags.SMTP_FROM_NAME, mail.DefaultSMTPFromName, "SMTP-From Name")
 | 
						|
	rootCmd.Flags().String(flags.SMTP_HELO, hostname, "SMTP-HELO/EHLO")
 | 
						|
	rootCmd.Flags().String(flags.SMTP_HOST, mail.DefaultSMTPHost, "SMTP-Host")
 | 
						|
	rootCmd.Flags().String(flags.SMTP_PASSWORD, "", "SMTP-Password")
 | 
						|
	rootCmd.Flags().String(flags.SMTP_USERNAME, "", "SMTP-User")
 | 
						|
	rootCmd.Flags().StringArray(flags.SMTP_TO_ADDRESSES, []string{}, "List of recipients")
 | 
						|
 | 
						|
	rootCmd.AddCommand(completionCmd)
 | 
						|
 | 
						|
	err = rootCmd.Execute()
 | 
						|
	if err != nil {
 | 
						|
		return fmt.Errorf("failed to execute root cmd: %w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func initializeConfig(cmd *cobra.Command) error {
 | 
						|
	v := viper.New()
 | 
						|
 | 
						|
	// Set the base name of the config file, without the file extension.
 | 
						|
	v.SetConfigName(defaultConfigFilename)
 | 
						|
	v.SetConfigType(defaultConfigExtension)
 | 
						|
 | 
						|
	// Set as many paths as you like where viper should look for the
 | 
						|
	// config file. We are only looking in the current working directory.
 | 
						|
	v.AddConfigPath(".")
 | 
						|
	v.AddConfigPath("$HOME/.config/drone-email/")
 | 
						|
	v.AddConfigPath("/etc/drone-email/")
 | 
						|
 | 
						|
	// Attempt to read the config file, gracefully ignoring errors
 | 
						|
	// caused by a config file not being found. Return an error
 | 
						|
	// if we cannot parse the config file.
 | 
						|
	if err := v.ReadInConfig(); err != nil {
 | 
						|
		// It's okay if there isn't a config file
 | 
						|
		if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
 | 
						|
			return fmt.Errorf("failed to read config: %w", err)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// Bind to environment variables
 | 
						|
	// Works great for simple config names, but needs help for names
 | 
						|
	// like --favorite-color which we fix in the bindFlags function
 | 
						|
	v.AutomaticEnv()
 | 
						|
 | 
						|
	// Bind the current command's flags to viper
 | 
						|
	bindFlags(cmd, v)
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// Bind each cobra flag to its associated viper configuration (config file and environment variable)
 | 
						|
func bindFlags(cmd *cobra.Command, v *viper.Viper) {
 | 
						|
	cmd.Flags().VisitAll(func(f *pflag.Flag) {
 | 
						|
		// Environment variables can't have dashes in them, so bind them to their equivalent
 | 
						|
		// keys with underscores, e.g. --favorite-color to STING_FAVORITE_COLOR
 | 
						|
		if strings.Contains(f.Name, "-") {
 | 
						|
			envVarSuffix := strings.ToUpper(strings.ReplaceAll(f.Name, "-", "_"))
 | 
						|
			if len(envPrefix) <= 0 {
 | 
						|
				_ = v.BindEnv(f.Name, envVarSuffix)
 | 
						|
			} else {
 | 
						|
				_ = v.BindEnv(f.Name, fmt.Sprintf("%s_%s", envPrefix, envVarSuffix))
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// Apply the viper config value to the flag when the flag is not set and viper has a value
 | 
						|
		if !f.Changed && v.IsSet(f.Name) {
 | 
						|
			val := v.Get(f.Name)
 | 
						|
			_ = cmd.Flags().Set(f.Name, fmt.Sprintf("%v", val))
 | 
						|
		}
 | 
						|
	})
 | 
						|
}
 | 
						|
 | 
						|
func newHTMLTemplateVarsByCommand(cmd *cobra.Command) (*mail.CIVars, error) {
 | 
						|
	build, err := newBuildByCommand(cmd)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to initialize new build struct: %w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	commit, err := newCommitByCommand(cmd)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to initialize new commit struct: %w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	deployTo, err := cmd.Flags().GetString(flags.DRONE_DEPLOY_TO)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_DEPLOY_TO, err)
 | 
						|
	}
 | 
						|
 | 
						|
	job, err := newJobByCommand(cmd)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to initialize new job struct: %w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	prev, err := newPrevByCommand(cmd)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to initialize new prev struct: %w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	pullRequests, err := cmd.Flags().GetInt(flags.DRONE_PULL_REQUEST)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_PULL_REQUEST, err)
 | 
						|
	}
 | 
						|
 | 
						|
	remote, err := newRemoteByCommand(cmd)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to initialize new remote struct: %w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	repo, err := newRepoByCommand(cmd)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to initialize new repo struct: %w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	tag, err := cmd.Flags().GetString(flags.DRONE_TAG)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_TAG, err)
 | 
						|
	}
 | 
						|
 | 
						|
	yaml, err := newYAMLByCommand(cmd)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to initialize new yaml struct: %w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	return &mail.CIVars{
 | 
						|
		Build:       build,
 | 
						|
		Commit:      commit,
 | 
						|
		DeployTo:    deployTo,
 | 
						|
		Job:         job,
 | 
						|
		Prev:        prev,
 | 
						|
		PullRequest: pullRequests,
 | 
						|
		Remote:      remote,
 | 
						|
		Repo:        repo,
 | 
						|
		Tag:         tag,
 | 
						|
		Yaml:        yaml,
 | 
						|
	}, nil
 | 
						|
}
 | 
						|
 | 
						|
func newBuildByCommand(cmd *cobra.Command) (*domain.Build, error) {
 | 
						|
	buildCreated, err := cmd.Flags().GetInt64(flags.DRONE_BUILD_CREATED)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_CREATED, err)
 | 
						|
	}
 | 
						|
 | 
						|
	buildEvent, err := cmd.Flags().GetString(flags.DRONE_BUILD_EVENT)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_EVENT, err)
 | 
						|
	}
 | 
						|
 | 
						|
	buildFinished, err := cmd.Flags().GetInt64(flags.DRONE_BUILD_FINISHED)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_FINISHED, err)
 | 
						|
	}
 | 
						|
 | 
						|
	buildLink, err := cmd.Flags().GetString(flags.DRONE_BUILD_LINK)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_LINK, err)
 | 
						|
	}
 | 
						|
 | 
						|
	buildNumber, err := cmd.Flags().GetInt(flags.DRONE_BUILD_NUMBER)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_NUMBER, err)
 | 
						|
	}
 | 
						|
 | 
						|
	buildStared, err := cmd.Flags().GetInt64(flags.DRONE_BUILD_STARTED)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_STARTED, err)
 | 
						|
	}
 | 
						|
 | 
						|
	buildStatus, err := cmd.Flags().GetString(flags.DRONE_BUILD_STATUS)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_STATUS, err)
 | 
						|
	}
 | 
						|
 | 
						|
	build := &domain.Build{
 | 
						|
		Created:  buildCreated,
 | 
						|
		Event:    buildEvent,
 | 
						|
		Finished: buildFinished,
 | 
						|
		Link:     buildLink,
 | 
						|
		Number:   buildNumber,
 | 
						|
		Started:  buildStared,
 | 
						|
		Status:   buildStatus,
 | 
						|
	}
 | 
						|
 | 
						|
	return build, nil
 | 
						|
}
 | 
						|
 | 
						|
func newCommitByCommand(cmd *cobra.Command) (*domain.Commit, error) {
 | 
						|
	authorAvatar, err := cmd.Flags().GetString(flags.DRONE_COMMIT_AUTHOR_AVATAR)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_AUTHOR_AVATAR, err)
 | 
						|
	}
 | 
						|
 | 
						|
	authorEmail, err := cmd.Flags().GetString(flags.DRONE_COMMIT_AUTHOR_EMAIL)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_AUTHOR_EMAIL, err)
 | 
						|
	}
 | 
						|
 | 
						|
	authorName, err := cmd.Flags().GetString(flags.DRONE_COMMIT_AUTHOR_NAME)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_AUTHOR_NAME, err)
 | 
						|
	}
 | 
						|
 | 
						|
	branch, err := cmd.Flags().GetString(flags.DRONE_COMMIT_BRANCH)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_BRANCH, err)
 | 
						|
	}
 | 
						|
 | 
						|
	link, err := cmd.Flags().GetString(flags.DRONE_COMMIT_LINK)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_LINK, err)
 | 
						|
	}
 | 
						|
 | 
						|
	message, err := cmd.Flags().GetString(flags.DRONE_COMMIT_MESSAGE)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_MESSAGE, err)
 | 
						|
	}
 | 
						|
 | 
						|
	ref, err := cmd.Flags().GetString(flags.DRONE_COMMIT_REF)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_REF, err)
 | 
						|
	}
 | 
						|
 | 
						|
	sha, err := cmd.Flags().GetString(flags.DRONE_COMMIT_SHA)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_COMMIT_SHA, err)
 | 
						|
	}
 | 
						|
 | 
						|
	commit := &domain.Commit{
 | 
						|
		Author: &domain.Author{
 | 
						|
			Avatar: authorAvatar,
 | 
						|
			Email:  authorEmail,
 | 
						|
			Name:   authorName,
 | 
						|
		},
 | 
						|
		Branch:  branch,
 | 
						|
		Link:    link,
 | 
						|
		Message: message,
 | 
						|
		Ref:     ref,
 | 
						|
		Sha:     sha,
 | 
						|
	}
 | 
						|
 | 
						|
	return commit, nil
 | 
						|
}
 | 
						|
 | 
						|
func newJobByCommand(cmd *cobra.Command) (*domain.Job, error) {
 | 
						|
	exitCode, err := cmd.Flags().GetInt(flags.DRONE_JOB_EXIT_CODE)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_JOB_EXIT_CODE, err)
 | 
						|
	}
 | 
						|
 | 
						|
	finished, err := cmd.Flags().GetInt64(flags.DRONE_BUILD_FINISHED)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_FINISHED, err)
 | 
						|
	}
 | 
						|
 | 
						|
	started, err := cmd.Flags().GetInt64(flags.DRONE_BUILD_STARTED)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_BUILD_STARTED, err)
 | 
						|
	}
 | 
						|
 | 
						|
	status, err := cmd.Flags().GetString(flags.DRONE_JOB_STATUS)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_JOB_STATUS, err)
 | 
						|
	}
 | 
						|
 | 
						|
	job := &domain.Job{
 | 
						|
		ExitCode: exitCode,
 | 
						|
		Finished: finished,
 | 
						|
		Started:  started,
 | 
						|
		Status:   status,
 | 
						|
	}
 | 
						|
 | 
						|
	return job, nil
 | 
						|
}
 | 
						|
 | 
						|
func newPrevByCommand(cmd *cobra.Command) (*domain.Prev, error) {
 | 
						|
	prevBuildNumber, err := cmd.Flags().GetInt(flags.DRONE_PREV_BUILD_NUMBER)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_PREV_BUILD_NUMBER, err)
 | 
						|
	}
 | 
						|
 | 
						|
	prevBuildStatus, err := cmd.Flags().GetString(flags.DRONE_PREV_BUILD_STATUS)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_PREV_BUILD_STATUS, err)
 | 
						|
	}
 | 
						|
 | 
						|
	prevCommitSha, err := cmd.Flags().GetString(flags.DRONE_PREV_COMMIT_SHA)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_PREV_COMMIT_SHA, err)
 | 
						|
	}
 | 
						|
 | 
						|
	prev := &domain.Prev{
 | 
						|
		Build: &domain.PrevBuild{
 | 
						|
			Number: prevBuildNumber,
 | 
						|
			Status: prevBuildStatus,
 | 
						|
		},
 | 
						|
		Commit: &domain.PrevCommit{
 | 
						|
			Sha: prevCommitSha,
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	return prev, nil
 | 
						|
}
 | 
						|
 | 
						|
func newRemoteByCommand(cmd *cobra.Command) (*domain.Remote, error) {
 | 
						|
	remoteURL, err := cmd.Flags().GetString(flags.DRONE_REMOTE_URL)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REMOTE_URL, err)
 | 
						|
	}
 | 
						|
 | 
						|
	remote := &domain.Remote{
 | 
						|
		URL: remoteURL,
 | 
						|
	}
 | 
						|
 | 
						|
	return remote, nil
 | 
						|
}
 | 
						|
 | 
						|
func newRepoByCommand(cmd *cobra.Command) (*domain.Repo, error) {
 | 
						|
	avatar, err := cmd.Flags().GetString(flags.DRONE_REPO_AVATAR)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_AVATAR, err)
 | 
						|
	}
 | 
						|
 | 
						|
	branch, err := cmd.Flags().GetString(flags.DRONE_REPO_BRANCH)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_BRANCH, err)
 | 
						|
	}
 | 
						|
 | 
						|
	fullName, err := cmd.Flags().GetString(flags.DRONE_REPO_NAME)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_NAME, err)
 | 
						|
	}
 | 
						|
 | 
						|
	link, err := cmd.Flags().GetString(flags.DRONE_REPO_LINK)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_LINK, err)
 | 
						|
	}
 | 
						|
 | 
						|
	name, err := cmd.Flags().GetString(flags.DRONE_REPO)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO, err)
 | 
						|
	}
 | 
						|
 | 
						|
	owner, err := cmd.Flags().GetString(flags.DRONE_REPO_OWNER)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_OWNER, err)
 | 
						|
	}
 | 
						|
 | 
						|
	private, err := cmd.Flags().GetBool(flags.DRONE_REPO_PRIVATE)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_PRIVATE, err)
 | 
						|
	}
 | 
						|
 | 
						|
	scm, err := cmd.Flags().GetString(flags.DRONE_REPO_SCM)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_SCM, err)
 | 
						|
	}
 | 
						|
 | 
						|
	trusted, err := cmd.Flags().GetBool(flags.DRONE_REPO_TRUSTED)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_REPO_TRUSTED, err)
 | 
						|
	}
 | 
						|
 | 
						|
	remote := &domain.Repo{
 | 
						|
		Avatar:   avatar,
 | 
						|
		Branch:   branch,
 | 
						|
		FullName: fullName,
 | 
						|
		Link:     link,
 | 
						|
		Name:     name,
 | 
						|
		Owner:    owner,
 | 
						|
		Private:  private,
 | 
						|
		SCM:      scm,
 | 
						|
		Trusted:  trusted,
 | 
						|
	}
 | 
						|
 | 
						|
	return remote, nil
 | 
						|
}
 | 
						|
 | 
						|
func newYAMLByCommand(cmd *cobra.Command) (*domain.Yaml, error) {
 | 
						|
	signed, err := cmd.Flags().GetBool(flags.DRONE_YAML_SIGNED)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_YAML_SIGNED, err)
 | 
						|
	}
 | 
						|
 | 
						|
	verified, err := cmd.Flags().GetBool(flags.DRONE_YAML_VERIFIED)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.DRONE_YAML_VERIFIED, err)
 | 
						|
	}
 | 
						|
 | 
						|
	yaml := &domain.Yaml{
 | 
						|
		Signed:   signed,
 | 
						|
		Verified: verified,
 | 
						|
	}
 | 
						|
 | 
						|
	return yaml, nil
 | 
						|
}
 | 
						|
 | 
						|
func newSMTPSettingsByCommand(cmd *cobra.Command) (*domain.SMTPSettings, error) {
 | 
						|
	smtpStartTLS, err := cmd.Flags().GetBool(flags.SMTP_START_TLS)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_START_TLS, err)
 | 
						|
	}
 | 
						|
 | 
						|
	smtpFromAddress, err := cmd.Flags().GetString(flags.SMTP_FROM_ADDRESS)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_FROM_ADDRESS, err)
 | 
						|
	}
 | 
						|
 | 
						|
	smtpFromName, err := cmd.Flags().GetString(flags.SMTP_FROM_NAME)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_FROM_NAME, err)
 | 
						|
	}
 | 
						|
 | 
						|
	smtpHELOName, err := cmd.Flags().GetString(flags.SMTP_HELO)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_HELO, err)
 | 
						|
	}
 | 
						|
 | 
						|
	smtpHost, err := cmd.Flags().GetString(flags.SMTP_HOST)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_HOST, err)
 | 
						|
	}
 | 
						|
 | 
						|
	smtpPassword, err := cmd.Flags().GetString(flags.SMTP_PASSWORD)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_PASSWORD, err)
 | 
						|
	}
 | 
						|
 | 
						|
	smtpPort, err := cmd.Flags().GetInt(flags.SMTP_PORT)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_PORT, err)
 | 
						|
	}
 | 
						|
 | 
						|
	smtpTLSInsecureSkipVerify, err := cmd.Flags().GetBool(flags.SMTP_TLS_INSECURE_SKIP_VERIFY)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_TLS_INSECURE_SKIP_VERIFY, err)
 | 
						|
	}
 | 
						|
 | 
						|
	smtpUsername, err := cmd.Flags().GetString(flags.SMTP_USERNAME)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("failed to detect value of %s: %w", flags.SMTP_USERNAME, err)
 | 
						|
	}
 | 
						|
 | 
						|
	return &domain.SMTPSettings{
 | 
						|
		FromAddress:           smtpFromAddress,
 | 
						|
		FromName:              smtpFromName,
 | 
						|
		HELOName:              smtpHELOName,
 | 
						|
		Host:                  smtpHost,
 | 
						|
		Password:              smtpPassword,
 | 
						|
		Port:                  smtpPort,
 | 
						|
		StartTLS:              smtpStartTLS,
 | 
						|
		TLSInsecureSkipVerify: smtpTLSInsecureSkipVerify,
 | 
						|
		Username:              smtpUsername,
 | 
						|
	}, nil
 | 
						|
}
 |