From 6c9558c0d2201d933b1d396febeb6e70ceaad058 Mon Sep 17 00:00:00 2001 From: tjp Date: Wed, 3 Jan 2024 08:29:40 -0700 Subject: working basic navigation and marks --- mark.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 mark.go (limited to 'mark.go') diff --git a/mark.go b/mark.go new file mode 100644 index 0000000..63284c5 --- /dev/null +++ b/mark.go @@ -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) + } +} -- cgit v1.2.3