mirror of
https://github.com/wavetermdev/waveterm.git
synced 2025-01-30 23:01:30 +01:00
get last statement
This commit is contained in:
parent
9d8d112c79
commit
be376deb54
@ -1,6 +1,7 @@
|
||||
package newton
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
@ -9,13 +10,72 @@ import (
|
||||
)
|
||||
|
||||
func TraverseCmds(cmdStr utilfn.StrWithPos) error {
|
||||
cmdReader := strings.NewReader(cmdStr.String())
|
||||
if cmdStr.Str == "" {
|
||||
return nil
|
||||
}
|
||||
cmdReader := strings.NewReader(cmdStr.Str)
|
||||
parser := syntax.NewParser(syntax.Variant(syntax.LangBash))
|
||||
file, err := parser.Parse(cmdReader, "cmd")
|
||||
file, err := parser.Parse(cmdReader, "")
|
||||
if err != nil {
|
||||
return fmt.Errorf("error parsing command: %w", err)
|
||||
}
|
||||
lastCmd := file.Last
|
||||
fmt.Printf("lastCmd: %#v\n", lastCmd)
|
||||
// syntax.Walk(file, func(node syntax.Node) bool {
|
||||
// switch x := node.(type) {
|
||||
// case *syntax.ParamExp:
|
||||
// x.Param.Value = strings.ToUpper(x.Param.Value)
|
||||
// }
|
||||
// return true
|
||||
// })
|
||||
// syntax.NewPrinter().Print(os.Stdout, file)
|
||||
exprs := []*syntax.CallExpr{}
|
||||
stmts := []*syntax.Stmt{}
|
||||
debugStr := new(bytes.Buffer)
|
||||
syntax.DebugPrint(debugStr, file)
|
||||
fmt.Sprintln(debugStr.String())
|
||||
|
||||
syntax.Walk(file, func(node syntax.Node) bool {
|
||||
switch x := node.(type) {
|
||||
case *syntax.CallExpr:
|
||||
exprs = append(exprs, x)
|
||||
case *syntax.Stmt:
|
||||
stmts = append(stmts, x)
|
||||
}
|
||||
return true
|
||||
})
|
||||
lastExpr := exprs[len(exprs)-1]
|
||||
lastExprStr := new(bytes.Buffer)
|
||||
for _, arg := range lastExpr.Args {
|
||||
lastExprStr.WriteString(arg.Lit())
|
||||
}
|
||||
|
||||
lastStmt := stmts[len(stmts)-1]
|
||||
lastStmtStr := new(bytes.Buffer)
|
||||
for _, arg := range lastStmt.Cmd.(*syntax.CallExpr).Args {
|
||||
for _, part := range arg.Parts {
|
||||
switch x := part.(type) {
|
||||
case *syntax.Lit:
|
||||
lastStmtStr.WriteString(x.Value)
|
||||
case *syntax.SglQuoted:
|
||||
lastStmtStr.WriteString(fmt.Sprintf("'%s'", x.Value))
|
||||
case *syntax.DblQuoted:
|
||||
lastStmtStr.WriteByte('"')
|
||||
for _, part := range x.Parts {
|
||||
switch x := part.(type) {
|
||||
case *syntax.Lit:
|
||||
lastStmtStr.WriteString(x.Value)
|
||||
case *syntax.ParamExp:
|
||||
lastStmtStr.WriteString(x.Param.Value)
|
||||
}
|
||||
}
|
||||
lastStmtStr.WriteByte('"')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, redir := range lastStmt.Redirs {
|
||||
lastStmtStr.WriteString(redir.Op.String())
|
||||
lastStmtStr.WriteString(redir.Word.Lit())
|
||||
}
|
||||
fmt.Printf("last statement: %s\n", lastStmtStr.String())
|
||||
return nil
|
||||
}
|
||||
|
@ -1,7 +1,19 @@
|
||||
package newton
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/wavetermdev/waveterm/wavesrv/pkg/utilfn"
|
||||
)
|
||||
|
||||
func TestNewtonParse(t *testing.T) {
|
||||
|
||||
testStr := utilfn.StrWithPos{
|
||||
Str: `echo "hello world" | cat -n | grep "hello" | sed 's/hello/hi/g' > /tmp/test.txt`,
|
||||
Pos: 1,
|
||||
}
|
||||
err := TraverseCmds(testStr)
|
||||
t.Error()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user