コード例 #1
0
ファイル: add.go プロジェクト: danielkocher/link-select
// AddLink adds a link to file (in JSON format).
// file is supposed to be a JSON file in the read, watch or book format (see
// link-select/types for further details).
// It returns nil on success and the error on failure (propagates the error).
func AddLink(file string) error {
	fmt.Fprintf(os.Stdout, "Adding to %s\n", file)

	// input of title and link
	var newEntry types.BaseRecord
	kbInput := bufio.NewReader(os.Stdin)
	fmt.Fprintf(os.Stdout, "Title: ")
	newEntry.Title, _ = kbInput.ReadString('\n')
	fmt.Fprintf(os.Stdout, "Link: ")
	newEntry.Link, _ = kbInput.ReadString('\n')

	// trim trailing newlines
	newEntry.Title = strings.TrimSuffix(newEntry.Title, "\n")
	newEntry.Link = strings.TrimSuffix(newEntry.Link, "\n")

	// as appending to a JSON file does not work directory we do the following:
	// (1) decode/parse JSON file
	var list types.RecordList
	if err := list.Read(file); err != nil {
		return err
	}

	// (2) append input data to decoded/parsed data
	list = append(list, newEntry)

	// (3) serialize the new data back to the JSON file
	// write back to JSON file
	if err := list.Write(file); err != nil {
		return err
	}

	return nil
}
コード例 #2
0
ファイル: sel.go プロジェクト: danielkocher/link-select
// SelectLink selects a link from file and opens it in a bg process in browser.
// file is supposed to be a JSON file in the read, watch or book format (see
// link-select/types for further details).
// It returns nil on success and the error on failure (propagates the error).
func SelectLink(file string, browser string) error {
	fmt.Fprintf(os.Stdout, "Selecting from %s\n", file)

	var list types.RecordList
	if err := list.Read(file); err != nil {
		return err
	}

	if len(list) <= 0 {
		return errors.New("List contains no links")
	}

	// set new seed to get non-deterministic random number generation
	randSrc := rand.NewSource(time.Now().UnixNano())
	r := rand.New(randSrc)

	// select random article
	rndArticle := r.Intn(len(list))
	fmt.Fprintf(os.Stdout, "Selected \"%s\"\n", list[rndArticle].Title)

	// open link in browser
	cmd := exec.Command(browser, list[rndArticle].Link)
	if err := cmd.Start(); err != nil {
		fmt.Fprintf(os.Stderr, "Error while opening %s in %s\n",
			list[rndArticle], browser)
		return err
	}

	// remove selected article from list
	list = append(list[:rndArticle], list[rndArticle+1:]...)

	// write back to JSON file
	if err := list.Write(file); err != nil {
		return err
	}

	return nil
}