blueprint/cmd/app.go
Danil Solovyov ddb7be7dff Update app
Changes:
- cmd/app.go
    - Удален Config за ненадобностью;
    - Добавлены флаги -n, -g, -f. Подробно в документации;
    - Теперь при запуске приложения создаются папка приложения и временная папка приложения;
    - Добавлено чтение из папки и чтение из git-репозитория;

- blueprint:
    - слегка изменена логика проверки файла настроек;
    - в creator добавлена переменная projectName;
    - в template просто переименовал структуру;

- modules/env:
    - добавлена проверка обязательных значений из настроек;
    - добавлена проверка значения переменной в Declaration;
    - поправлена периодическая ошибка с go get;

- modules/logger;
    - удалена ненужная функция GetFunctions();
    - добавлена проверка значения переменной messageType для Message;
    - поправлена периодическая ошибка с go get;

- README.md: добавлена документация по приложению.
2023-12-27 10:54:41 +05:00

199 lines
4.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cmd
import (
"flag"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"github.com/rs/zerolog/log"
"penahub.gitlab.yandexcloud.net/pena-services/bluepint/blueprint"
)
type App struct {
Name string
Version string
Dir string
TempDir string
}
type StartFlags struct {
ProjectName string
Git string
Folder string
}
func NewApp() *App {
return &App{
Name: "blueprint",
Version: "0.0.1",
}
}
// Execute - Любой вызов приложения.
func (r *App) Execute() {
versionFlag := flag.Bool("v", false, "Show current version")
projectNameFlag := flag.String("n", "", "Set project name")
gitFlag := flag.String("g", "", "Get blueprint from git")
folderFlag := flag.String("f", "", "Get blueprint from ../<user>/blueprint/<folder>")
flag.Parse()
if *versionFlag {
if err := r.PrintVersion(); err != nil {
log.Error().Err(err).Msg("PrintVersion")
return
}
return
}
startFlags := StartFlags{
ProjectName: *projectNameFlag,
Git: *gitFlag,
Folder: *folderFlag,
}
log.Info().Str("version", r.Version).Msg("Blueprint started")
if err := r.Run(startFlags); err != nil {
log.Error().Err(err).Msg("Run app")
}
defer func() {
if err := r.Close(); err != nil {
log.Error().Err(err).Msg("Close app")
}
log.Info().Msg("Blueprint closed")
}()
}
// Run - Запуск приложения.
func (r *App) Run(flags StartFlags) error {
var err error
var blueprintPath, projectName string
// Create app directory and temporary directory
log.Info().Msg("Creating app directory")
if err = r.createDir(); err != nil {
return fmt.Errorf("cannot create app directory. %v", err)
}
log.Info().Msg("Creating temporary app directory")
if err = r.createTempDir(); err != nil {
return fmt.Errorf("cannot create temporary app directory. %v", err)
}
if flags.Folder != "" {
blueprintPath, err = r.getFromFolder(flags.Folder)
if err != nil {
return fmt.Errorf("cannot get from folder. %v", err)
}
}
if flags.Git != "" {
blueprintPath, err = r.getFromGit(flags.Git)
if err != nil {
return fmt.Errorf("cannot get from git. %v", err)
}
}
if flags.ProjectName != "" {
projectName = flags.ProjectName
}
blueprintCreator, err := blueprint.NewBlueprintCreator(blueprintPath, projectName)
if err != nil {
return fmt.Errorf("cannot create blueprint creator. %v", err)
}
if err = blueprintCreator.Create(); err != nil {
return fmt.Errorf("cannot create app. %v", err)
}
log.Info().Msg("Closing app")
return nil
}
func (r *App) Close() error {
log.Info().Msg("removing temporary directory")
return os.RemoveAll(r.TempDir)
}
// PrintVersion - Вывод версии приложения.
func (r *App) PrintVersion() error {
_, err := fmt.Println("Version: ", r.Version)
if err != nil {
return fmt.Errorf("cannot print. %v", err)
}
return nil
}
// createDir - создает папку приложения, если она не существует.
func (r *App) createDir() error {
path, err := os.UserHomeDir()
if err != nil {
return err
}
path = filepath.Join(path, r.Name)
r.Dir = path
_, err = os.Stat(r.Dir)
if err == nil {
return nil
}
if os.IsNotExist(err) {
return os.Mkdir(r.Dir, 0750)
}
return err
}
func (r *App) createTempDir() error {
path, err := os.MkdirTemp("", fmt.Sprintf("%v-*", r.Name))
if err != nil {
return err
}
r.TempDir = path
return nil
}
// getFromGit - возвращает папку с расположением git-репозитория указанного в флаге. Использует команду git clone для загрузки из git-репозитория.
func (r *App) getFromGit(url string) (path string, err error) {
cmd := exec.Command("git", "clone", url)
cmd.Dir = r.TempDir
if err := cmd.Run(); err != nil {
return "", err
}
url = strings.TrimSuffix(url, ".git")
repoName := filepath.Base(url)
path = filepath.Join(r.TempDir, repoName)
return path, nil
}
// getFromFolder - возвращает путь из папки приложения + папка из флага. Если папка не существует, то вернется ошибка.
func (r *App) getFromFolder(folder string) (path string, err error) {
path = filepath.Join(r.Dir, folder)
_, err = os.Stat(path)
if err != nil {
return "", err
}
return path, nil
}