github.com/kcmerrill/alfred@v0.0.0-20180727171036-06445dcb5e3d/pkg/alfred/taskparser.go (about)

     1  package alfred
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  )
     7  
     8  // MagicTaskURL will parse "magic" tasks, as denoted by "__"
     9  func MagicTaskURL(task string) string {
    10  	url, _ := TaskParser(task, "alfred:list")
    11  	if strings.HasPrefix(url, "http") {
    12  		return url + ":"
    13  	}
    14  	return ""
    15  }
    16  
    17  // TaskParser returns a url and a task(default if necessary) (location, task)
    18  func TaskParser(task, defaultTask string) (string, string) {
    19  	// does it start with http?
    20  	if strings.HasPrefix(task, "http") && strings.Contains(task, "://") {
    21  		// we have to get the http: colon out of the way :(
    22  		bits := strings.SplitN(task, ":", 3)
    23  		url := strings.Join(bits[0:2], ":")
    24  		if len(bits) >= 3 {
    25  			// alright, so we have tasks and args ...
    26  			return url, bits[2]
    27  		}
    28  		return url, defaultTask
    29  	}
    30  
    31  	// is this a catalog?
    32  	if isCatalog(task) {
    33  		bits := strings.Split(task, ":")
    34  		if len(bits) >= 2 {
    35  			return bits[0], bits[1]
    36  		}
    37  		return bits[0], defaultTask
    38  	}
    39  
    40  	// does it start with a /? AND not a local directory? Aka a remote task?
    41  	if strings.HasPrefix(task, "/") {
    42  		bits := strings.Split(task, ":")
    43  		url := fmt.Sprintf("https://raw.githubusercontent.com/kcmerrill/alfred/master/remote-modules%s.yml", bits[0])
    44  
    45  		if len(bits) >= 2 {
    46  			return url, bits[1]
    47  		}
    48  		return url, defaultTask
    49  	}
    50  
    51  	// lets check if this is a github file(and not a local ./ task)
    52  	if !strings.HasPrefix(task, "./") && strings.Contains(task, "/") {
    53  		bits := strings.Split(task, ":")
    54  		url := fmt.Sprintf("https://raw.githubusercontent.com/%s/master/alfred.yml", bits[0])
    55  		if len(bits) >= 2 {
    56  			return url, bits[1]
    57  		}
    58  		return url, defaultTask
    59  	}
    60  
    61  	if task == "" {
    62  		return "./", defaultTask
    63  	}
    64  
    65  	if strings.HasPrefix(task, "!") {
    66  		return "./", "!exec.command"
    67  	}
    68  
    69  	// alright, so it's not a url, it's not a github repo, it must be just a regular local task
    70  	bits := strings.Split(task, ":")
    71  	if len(bits) >= 2 {
    72  		return bits[0], bits[1]
    73  	}
    74  	return "./", bits[0]
    75  }