add copy command (instruction)

This commit is contained in:
Adrien Marquès 2018-11-13 14:21:36 +01:00
parent c548e6a5e8
commit 48600584a0
2 changed files with 51 additions and 0 deletions

View File

@ -0,0 +1,47 @@
package instruction
import (
"fmt"
"os"
"strings"
)
type copy struct {
raw string
Src string
Dst string
}
func (d *copy) Raw() string { return strings.Join([]string{"copy", d.raw}, " ") }
func (d *copy) Build(_args string) error {
// 1. extract action (sub command)
split := strings.Split(_args, " ")
// 2. check syntax
if len(split) != 2 {
return ErrInvalidSyntax
}
d.Src = strings.Trim(split[0], " \t")
d.Dst = strings.Trim(split[1], " \t")
d.raw = _args
return nil
}
func (d copy) Exec(ctx ExecutionContext) ([]byte, error) {
// 1. fail if source file not found
if _, err := os.Stat(d.Src); os.IsNotExist(err) {
return nil, fmt.Errorf("cannot find script '%s'", d.Src)
}
// 2. execute script
if err := ctx.Executor.Command("cp", d.Src, d.Dst).Run(); err != nil {
return nil, fmt.Errorf("cannot copy '%s' to '%s' | %s", d.Src, d.Dst, err)
}
return nil, nil
}

View File

@ -40,6 +40,10 @@ func Parse(raw string) (T, error) {
i := &set{}
err := i.Build(split[1])
return i, err
case "copy":
i := &copy{}
err := i.Build(split[1])
return i, err
case "alias":
i := &alias{}
err := i.Build(split[1])