config.go

  1package launchpad
  2
  3import (
  4	"bufio"
  5	"fmt"
  6	"net/http"
  7	"os"
  8	"regexp"
  9	"strings"
 10
 11	"github.com/MichaelMure/git-bug/bridge/core"
 12	"github.com/MichaelMure/git-bug/repository"
 13)
 14
 15const keyProject = "project"
 16
 17var (
 18	rxLaunchpadURL = regexp.MustCompile(`launchpad\.net[\/:]([^\/]*[a-z]+)`)
 19)
 20
 21func (*Launchpad) Configure(repo repository.RepoCommon, params core.BridgeParams) (core.Configuration, error) {
 22	conf := make(core.Configuration)
 23	var err error
 24	var project string
 25
 26	if params.Project != "" {
 27		project = params.Project
 28
 29	} else if params.URL != "" {
 30		// get project name from url
 31		_, project, err = splitURL(params.URL)
 32		if err != nil {
 33			return nil, err
 34		}
 35
 36	} else {
 37		// get project name from terminal prompt
 38		project, err = promptProjectName()
 39		if err != nil {
 40			return nil, err
 41		}
 42	}
 43
 44	// verify project
 45	ok, err := validateProject(project)
 46	if err != nil {
 47		return nil, err
 48	}
 49	if !ok {
 50		return nil, fmt.Errorf("project doesn't exist")
 51	}
 52
 53	conf[keyProject] = project
 54	return conf, nil
 55}
 56
 57func (*Launchpad) ValidateConfig(conf core.Configuration) error {
 58	if _, ok := conf[keyProject]; !ok {
 59		return fmt.Errorf("missing %s key", keyProject)
 60	}
 61
 62	return nil
 63}
 64
 65func promptProjectName() (string, error) {
 66	for {
 67		fmt.Print("Launchpad project name: ")
 68
 69		line, err := bufio.NewReader(os.Stdin).ReadString('\n')
 70		if err != nil {
 71			return "", err
 72		}
 73
 74		line = strings.TrimRight(line, "\n")
 75
 76		if line == "" {
 77			fmt.Println("Project name is empty")
 78			continue
 79		}
 80
 81		return line, nil
 82	}
 83}
 84
 85func validateProject(project string) (bool, error) {
 86	url := fmt.Sprintf("%s/%s", apiRoot, project)
 87
 88	resp, err := http.Get(url)
 89	if err != nil {
 90		return false, err
 91	}
 92
 93	return resp.StatusCode == http.StatusOK, nil
 94}
 95
 96func splitURL(url string) (string, string, error) {
 97	res := rxLaunchpadURL.FindStringSubmatch(url)
 98	if res == nil {
 99		return "", "", fmt.Errorf("bad Launchpad project url")
100	}
101
102	return res[0], res[1], nil
103}