godog/pkg/formatters/ast/helpers.go

118 строки
2 КиБ
Go

package ast
import (
"fmt"
"go/ast"
"os"
"path/filepath"
"time"
"errors"
"git.golang1.ru/softonik/godog/pkg/lib"
)
const (
BACKUP_DIR = ".back"
)
func получитьИмяGoПакетаВЭтойДире() (pkg_name string, err_ret error) {
err_ret = errors.New("not found")
filepath.WalkDir(".", func(path string, info os.DirEntry, err error) error {
if err != nil {
return err
}
if !info.IsDir() && filepath.Ext(path) == ".go" {
pkg, err := lib.ПолучитьИмяGoПакетаФайла(path)
if err != nil {
return err
}
pkg_name = pkg
err_ret = nil
return filepath.SkipDir
}
return nil
})
return
}
func переименоватьФайлСоВременем(fname string) error {
os.MkdirAll(BACKUP_DIR, 0755)
currentTime := time.Now()
timestamp := currentTime.Format("20060102_150405")
new_fname := fmt.Sprintf(BACKUP_DIR+"/%v_%v", fname, timestamp)
return os.Rename(fname, new_fname)
}
func являетсяЛиШагомсТакойЖеФункцией(stmt ast.Stmt, step *ast.ExprStmt) bool {
e, ok := stmt.(*ast.ExprStmt)
if !ok {
return false
}
e_name, err := имяШага(e)
if err != nil {
return false
}
step_name, err := имяШага(step)
if err != nil {
return false
}
return e_name == step_name
}
func являетсяЛиШагом(stmt ast.Stmt) bool {
e, ok := stmt.(*ast.ExprStmt)
if !ok {
return false
}
e_name, err := имяШага(e)
if err != nil {
return false
}
return len(e_name) > 0
}
func имяШага(step *ast.ExprStmt) (res string, err error) {
err = errors.New("not found")
call, ok := step.X.(*ast.CallExpr)
if !ok {
return
}
selector, ok := call.Fun.(*ast.SelectorExpr)
if !ok {
return
}
ctx, ok := selector.X.(*ast.Ident)
if !ok {
return
}
if ctx.Name != "ctx" {
return
}
if selector.Sel.Name != "Step" {
return
}
if len(call.Args) < 2 {
return
}
fn, ok := call.Args[1].(*ast.Ident)
if !ok {
return
}
return fn.Name, nil
}