diff options
Diffstat (limited to 'mark.go')
| -rw-r--r-- | mark.go | 64 |
1 files changed, 64 insertions, 0 deletions
@@ -0,0 +1,64 @@ +package main + +import ( + "bytes" + "errors" + "fmt" + "strings" +) + +var ( + ErrInvalidURL = errors.New("that's not a valid URL") + ErrNotAMark = errors.New("that's not a known mark name") +) + +func MarkAdd(state *BrowserState, conf *Config, name, target string) error { + u, _, err := parseURL(target, state, conf.DefaultScheme) + if err != nil { + return ErrInvalidURL + } + + state.Marks[name] = u.String() + return saveMarks(state.Marks) +} + +func MarkGo(state *BrowserState, conf *Config, name string) error { + target, err := findMark(state, name) + if err != nil { + return err + } + + return Go(state, target, conf) +} + +func MarkList(state *BrowserState) error { + buf := &bytes.Buffer{} + for name, target := range state.Marks { + _, err := fmt.Fprintf(buf, "%s: %s\n", name, target) + if err != nil { + return err + } + } + state.Modal = buf.Bytes() + return Print(state) +} + +func findMark(state *BrowserState, prefix string) (string, error) { + found := 0 + value := "" + for name, target := range state.Marks { + if strings.HasPrefix(name, prefix) { + found += 1 + value = target + } + } + + switch found { + case 0: + return "", ErrNotAMark + case 1: + return value, nil + default: + return "", fmt.Errorf("too ambiguous - found %d matching marks", found) + } +} |
