summaryrefslogtreecommitdiff
path: root/mark.go
diff options
context:
space:
mode:
authortjp <tjp@ctrl-c.club>2024-01-03 08:29:40 -0700
committertjp <tjp@ctrl-c.club>2024-01-03 08:29:40 -0700
commit6c9558c0d2201d933b1d396febeb6e70ceaad058 (patch)
tree565b8b048fc3e63b6c2eb6892a6f356f0c3c15aa /mark.go
parent4b3dd896fb0c157e0d727f39ccb6d940a75d1cce (diff)
working basic navigation and marks
Diffstat (limited to 'mark.go')
-rw-r--r--mark.go64
1 files changed, 64 insertions, 0 deletions
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)
+ }
+}