github.com/Benchkram/bob@v0.0.0-20220321080157-7c8f3876e225/pkg/multilinecmd/multilinecmd.go (about)

     1  package multilinecmd
     2  
     3  import (
     4  	"strings"
     5  )
     6  
     7  // Split splits a single-line "command" to a slice of commands.
     8  //
     9  // It currently supports the following syntaxes:
    10  //
    11  /*
    12    Input:
    13      echo Hello
    14    Output:
    15      [ "echo Hello", ]
    16  
    17    Input:
    18      echo Hello
    19      some long \
    20        command \
    21        with multiple line-breaks
    22    Output:
    23      [
    24        "echo Hello",
    25        "some long command with multiple line-breaks",
    26      ]
    27  */
    28  func Split(cmd string) []string {
    29  	// Remove backslash-newlines with a space.
    30  	// This adds support to use single commands spanning across multiple lines.
    31  	cmd = strings.ReplaceAll(cmd, "\\\n", " ")
    32  
    33  	// Replace multiple spaces with a single one.
    34  	// TODO: Reenable? echo 'Hello  World' will then no longer echo with two spaces.
    35  	// cmd = regexp.MustCompile(` +`).ReplaceAllString(cmd, " ")
    36  
    37  	// Replace leading and trailing spaces for clarity.
    38  	cmd = strings.TrimSpace(cmd)
    39  
    40  	cmds := strings.Split(cmd, "\n")
    41  	if len(cmds) == 1 && len(cmds[0]) == 0 {
    42  		return []string{}
    43  	}
    44  
    45  	return cmds
    46  }