aboutsummaryrefslogtreecommitdiff
path: root/statement.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2023-10-07 16:10:00 +0700
committerShulhan <ms@kilabit.info>2023-10-07 16:10:00 +0700
commit40ec2b806e86bf3aaa8f95982b2183c3f3a962e9 (patch)
treef4e0ae34b55c0bd4f86c5468372b87ae7a9d6c8b /statement.go
parent27a0a85d657d139b73e61d48a38628a6e3b682ed (diff)
downloadawwan-40ec2b806e86bf3aaa8f95982b2183c3f3a962e9.tar.xz
all: simplify parsing statement for magic command "#get" and "#put"
Since magic command get and put both use the same function, we can use loop to check and parse all of the get and put statement variants.
Diffstat (limited to 'statement.go')
-rw-r--r--statement.go63
1 files changed, 30 insertions, 33 deletions
diff --git a/statement.go b/statement.go
index e8199b6..bd7bc35 100644
--- a/statement.go
+++ b/statement.go
@@ -31,6 +31,15 @@ var (
cmdMagicRequire = []byte(`#require:`)
)
+// List of mapping between magic command kind and its command string for get
+// and put only.
+var magicCmdGetPut = map[int][]byte{
+ statementKindGet: cmdMagicGet,
+ statementKindPut: cmdMagicPut,
+ statementKindSudoGet: cmdMagicSudoGet,
+ statementKindSudoPut: cmdMagicSudoPut,
+}
+
// Statement contains parsed raw line from the script.
type Statement struct {
cmd string
@@ -42,50 +51,35 @@ type Statement struct {
// ParseStatement create and initialize new Statement from raw line.
// It will return nil if raw line is empty.
func ParseStatement(raw []byte) (stmt *Statement, err error) {
- var (
- logp = `ParseStatement`
-
- cmd string
- args []string
- )
+ var logp = `ParseStatement`
raw = bytes.TrimSpace(raw)
if len(raw) == 0 {
return nil, nil
}
- if bytes.HasPrefix(raw, cmdMagicGet) {
- raw = raw[len(cmdMagicGet):]
- stmt, err = parseStatementGetPut(statementKindGet, raw)
- if err != nil {
- return nil, fmt.Errorf(`%s: %q: %w`, logp, cmdMagicGet, err)
- }
- return stmt, nil
- }
- if bytes.HasPrefix(raw, cmdMagicPut) {
- raw = raw[len(cmdMagicPut):]
- stmt, err = parseStatementGetPut(statementKindPut, raw)
- if err != nil {
- return nil, fmt.Errorf(`%s: %q: %w`, logp, cmdMagicPut, err)
- }
- return stmt, nil
- }
- if bytes.HasPrefix(raw, cmdMagicSudoGet) {
- raw = raw[len(cmdMagicSudoGet):]
- stmt, err = parseStatementGetPut(statementKindSudoGet, raw)
- if err != nil {
- return nil, fmt.Errorf(`%s: %q: %w`, logp, cmdMagicSudoGet, err)
+ var (
+ cmdKind int
+ cmdMagic []byte
+ )
+
+ for cmdKind, cmdMagic = range magicCmdGetPut {
+ if !bytes.HasPrefix(raw, cmdMagic) {
+ continue
}
- return stmt, nil
- }
- if bytes.HasPrefix(raw, cmdMagicSudoPut) {
- raw = raw[len(cmdMagicSudoPut):]
- stmt, err = parseStatementGetPut(statementKindSudoPut, raw)
+ raw = raw[len(cmdMagic):]
+ stmt, err = parseStatementGetPut(cmdKind, raw)
if err != nil {
- return nil, fmt.Errorf(`%s: %q: %w`, logp, cmdMagicSudoPut, err)
+ return nil, fmt.Errorf(`%s: %q: %w`, logp, cmdMagic, err)
}
return stmt, nil
}
+
+ var (
+ cmd string
+ args []string
+ )
+
if bytes.HasPrefix(raw, cmdMagicRequire) {
raw = raw[len(cmdMagicRequire):]
cmd, args = libexec.ParseCommandArgs(string(raw))
@@ -97,6 +91,9 @@ func ParseStatement(raw []byte) (stmt *Statement, err error) {
}
return stmt, nil
}
+
+ // Comment check MUST be the last one after magic command, since
+ // both require '#' as first character.
if raw[0] == '#' {
stmt = &Statement{
kind: statementKindComment,