// 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 }
// 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 }