@@ -65,6 +65,7 @@ type Command struct {
65
65
Type CommandType
66
66
Options string
67
67
Args string
68
+ Source string
68
69
}
69
70
70
71
// String returns the string representation of the command.
@@ -123,15 +124,15 @@ func (p *Parser) Parse() []Command {
123
124
p .nextToken ()
124
125
continue
125
126
}
126
- cmds = append (cmds , p .parseCommand ())
127
+ cmds = append (cmds , p .parseCommand ()... )
127
128
p .nextToken ()
128
129
}
129
130
130
131
return cmds
131
132
}
132
133
133
134
// parseCommand parses a command.
134
- func (p * Parser ) parseCommand () Command {
135
+ func (p * Parser ) parseCommand () [] Command {
135
136
switch p .cur .Type {
136
137
case token .SPACE ,
137
138
token .BACKSPACE ,
@@ -146,42 +147,42 @@ func (p *Parser) parseCommand() Command {
146
147
token .UP ,
147
148
token .PAGEUP ,
148
149
token .PAGEDOWN :
149
- return p .parseKeypress (p .cur .Type )
150
+ return [] Command { p .parseKeypress (p .cur .Type )}
150
151
case token .SET :
151
- return p .parseSet ()
152
+ return [] Command { p .parseSet ()}
152
153
case token .OUTPUT :
153
- return p .parseOutput ()
154
+ return [] Command { p .parseOutput ()}
154
155
case token .SLEEP :
155
- return p .parseSleep ()
156
+ return [] Command { p .parseSleep ()}
156
157
case token .TYPE :
157
- return p .parseType ()
158
+ return [] Command { p .parseType ()}
158
159
case token .CTRL :
159
- return p .parseCtrl ()
160
+ return [] Command { p .parseCtrl ()}
160
161
case token .ALT :
161
- return p .parseAlt ()
162
+ return [] Command { p .parseAlt ()}
162
163
case token .SHIFT :
163
- return p .parseShift ()
164
+ return [] Command { p .parseShift ()}
164
165
case token .HIDE :
165
- return p .parseHide ()
166
+ return [] Command { p .parseHide ()}
166
167
case token .REQUIRE :
167
- return p .parseRequire ()
168
+ return [] Command { p .parseRequire ()}
168
169
case token .SHOW :
169
- return p .parseShow ()
170
+ return [] Command { p .parseShow ()}
170
171
case token .WAIT :
171
- return p .parseWait ()
172
+ return [] Command { p .parseWait ()}
172
173
case token .SOURCE :
173
174
return p .parseSource ()
174
175
case token .SCREENSHOT :
175
- return p .parseScreenshot ()
176
+ return [] Command { p .parseScreenshot ()}
176
177
case token .COPY :
177
- return p .parseCopy ()
178
+ return [] Command { p .parseCopy ()}
178
179
case token .PASTE :
179
- return p .parsePaste ()
180
+ return [] Command { p .parsePaste ()}
180
181
case token .ENV :
181
- return p .parseEnv ()
182
+ return [] Command { p .parseEnv ()}
182
183
default :
183
184
p .errors = append (p .errors , NewError (p .cur , "Invalid command: " + p .cur .Literal ))
184
- return Command {Type : token .ILLEGAL }
185
+ return [] Command {{ Type : token .ILLEGAL } }
185
186
}
186
187
}
187
188
@@ -652,13 +653,13 @@ func (p *Parser) parseEnv() Command {
652
653
// Source command takes a tape path to include in current tape.
653
654
//
654
655
// Source <path>
655
- func (p * Parser ) parseSource () Command {
656
+ func (p * Parser ) parseSource () [] Command {
656
657
cmd := Command {Type : token .SOURCE }
657
658
658
659
if p .peek .Type != token .STRING {
659
660
p .errors = append (p .errors , NewError (p .cur , "Expected path after Source" ))
660
661
p .nextToken ()
661
- return cmd
662
+ return [] Command { cmd }
662
663
}
663
664
664
665
srcPath := p .peek .Literal
@@ -668,15 +669,15 @@ func (p *Parser) parseSource() Command {
668
669
if ext != ".tape" {
669
670
p .errors = append (p .errors , NewError (p .peek , "Expected file with .tape extension" ))
670
671
p .nextToken ()
671
- return cmd
672
+ return [] Command { cmd }
672
673
}
673
674
674
675
// Check if tape exist
675
676
if _ , err := os .Stat (srcPath ); os .IsNotExist (err ) {
676
677
notFoundErr := fmt .Sprintf ("File %s not found" , srcPath )
677
678
p .errors = append (p .errors , NewError (p .peek , notFoundErr ))
678
679
p .nextToken ()
679
- return cmd
680
+ return [] Command { cmd }
680
681
}
681
682
682
683
// Check if source tape contains nested Source command
@@ -685,7 +686,7 @@ func (p *Parser) parseSource() Command {
685
686
readErr := fmt .Sprintf ("Unable to read file: %s" , srcPath )
686
687
p .errors = append (p .errors , NewError (p .peek , readErr ))
687
688
p .nextToken ()
688
- return cmd
689
+ return [] Command { cmd }
689
690
}
690
691
691
692
srcTape := string (d )
@@ -694,7 +695,7 @@ func (p *Parser) parseSource() Command {
694
695
readErr := fmt .Sprintf ("Source tape: %s is empty" , srcPath )
695
696
p .errors = append (p .errors , NewError (p .peek , readErr ))
696
697
p .nextToken ()
697
- return cmd
698
+ return [] Command { cmd }
698
699
}
699
700
700
701
srcLexer := lexer .New (srcTape )
@@ -706,7 +707,7 @@ func (p *Parser) parseSource() Command {
706
707
if cmd .Type == token .SOURCE {
707
708
p .errors = append (p .errors , NewError (p .peek , "Nested Source detected" ))
708
709
p .nextToken ()
709
- return cmd
710
+ return [] Command { cmd }
710
711
}
711
712
}
712
713
@@ -715,12 +716,23 @@ func (p *Parser) parseSource() Command {
715
716
if len (srcErrors ) > 0 {
716
717
p .errors = append (p .errors , NewError (p .peek , fmt .Sprintf ("%s has %d errors" , srcPath , len (srcErrors ))))
717
718
p .nextToken ()
718
- return cmd
719
+ return [] Command { cmd }
719
720
}
720
721
721
722
cmd .Args = p .peek .Literal
723
+ filtered := make ([]Command , 0 , len (srcCmds ))
724
+ for _ , srcCmd := range srcCmds {
725
+ // Output have to be avoid in order to not overwrite output of the original tape.
726
+ if srcCmd .Type == token .SOURCE ||
727
+ srcCmd .Type == token .OUTPUT {
728
+ continue
729
+ }
730
+ srcCmd .Source = cmd .Args
731
+ filtered = append (filtered , srcCmd )
732
+ }
733
+
722
734
p .nextToken ()
723
- return cmd
735
+ return filtered
724
736
}
725
737
726
738
// parseScreenshot parses screenshot command.
0 commit comments