Skip to content

Commit 2ee9125

Browse files
authored
Merge pull request #594 from 4evy/fix-preserve-rules
[fix] preserve rules when prioritizing results
2 parents dc1f205 + c5c36d3 commit 2ee9125

3 files changed

Lines changed: 70 additions & 3 deletions

File tree

cmd/tui/handle/overlays.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,7 @@ func PrioritizeInputKeys(m *model.Model, msg tea.KeyMsg) tea.Cmd {
295295
m.PrioritizeInput.Blur()
296296
m.State = m.PrevState
297297
if pattern != "" {
298-
m.RulesData.Priority = append(m.RulesData.Priority, pattern)
299-
return m.SaveRulesCmd()
298+
return m.PrioritizeRuleCmd(pattern)
300299
}
301300
return nil
302301
}

cmd/tui/model/model.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,8 +458,9 @@ func (m *Model) PostHistoryCmd(u string) tea.Cmd {
458458
func (m *Model) SaveRulesCmd() tea.Cmd {
459459
skip := strings.Join(m.RulesData.Skip, "\n")
460460
priority := strings.Join(m.RulesData.Priority, "\n")
461+
versioning := strings.Join(m.RulesData.Versioning, "\n")
461462
return func() tea.Msg {
462-
return RulesSavedMsg{Err: m.Client.SaveRules(skip, priority)}
463+
return RulesSavedMsg{Err: m.Client.SaveRules(skip, priority, versioning)}
463464
}
464465
}
465466

@@ -492,6 +493,24 @@ func (m *Model) AddAliasCmd(keyword, value string) tea.Cmd {
492493
}
493494
}
494495

496+
// PrioritizeRuleCmd reads the latest rules before appending a priority rule.
497+
// Result context menus are usable without visiting the Rules tab first, so
498+
// saving the model's possibly-empty cache here could erase server-side rules.
499+
func (m *Model) PrioritizeRuleCmd(pattern string) tea.Cmd {
500+
return func() tea.Msg {
501+
rules, err := m.Client.FetchRules()
502+
if err != nil {
503+
return RulesSavedMsg{Err: err}
504+
}
505+
rules.Priority = append(rules.Priority, pattern)
506+
return RulesSavedMsg{Err: m.Client.SaveRules(
507+
strings.Join(rules.Skip, "\n"),
508+
strings.Join(rules.Priority, "\n"),
509+
strings.Join(rules.Versioning, "\n"),
510+
)}
511+
}
512+
}
513+
495514
func (m *Model) DeleteAliasCmd(alias string) tea.Cmd {
496515
return func() tea.Msg {
497516
return RulesSavedMsg{Err: m.Client.DeleteAlias(alias)}

cmd/tui/model/rules_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package model
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
"net/http/httptest"
7+
"net/url"
8+
"testing"
9+
10+
"github.com/asciimoo/hister/client"
11+
"github.com/asciimoo/hister/config"
12+
)
13+
14+
func TestPrioritizeRulePreservesRulesNotLoadedInTUI(t *testing.T) {
15+
var saved url.Values
16+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
17+
switch r.Method {
18+
case http.MethodGet:
19+
_ = json.NewEncoder(w).Encode(client.RulesResponse{
20+
Skip: []string{"private/*"},
21+
Priority: []string{"existing/*"},
22+
Versioning: []string{"articles/*"},
23+
})
24+
case http.MethodPost:
25+
if err := r.ParseForm(); err != nil {
26+
t.Error(err)
27+
}
28+
saved = r.PostForm
29+
w.WriteHeader(http.StatusNoContent)
30+
}
31+
}))
32+
defer server.Close()
33+
34+
m := InitialModel(config.CreateDefaultConfig())
35+
m.Client = client.New(server.URL)
36+
msg := m.PrioritizeRuleCmd("new/*")().(RulesSavedMsg)
37+
if msg.Err != nil {
38+
t.Fatal(msg.Err)
39+
}
40+
if got := saved.Get("skip"); got != "private/*" {
41+
t.Fatalf("skip = %q", got)
42+
}
43+
if got := saved.Get("priority"); got != "existing/*\nnew/*" {
44+
t.Fatalf("priority = %q", got)
45+
}
46+
if got := saved.Get("versioning"); got != "articles/*" {
47+
t.Fatalf("versioning = %q", got)
48+
}
49+
}

0 commit comments

Comments
 (0)