diff options
Diffstat (limited to 'lib/marker')
-rw-r--r-- | lib/marker/marker.go | 48 | ||||
-rw-r--r-- | lib/marker/marker_test.go | 27 |
2 files changed, 39 insertions, 36 deletions
diff --git a/lib/marker/marker.go b/lib/marker/marker.go index a0860be9..55f70f42 100644 --- a/lib/marker/marker.go +++ b/lib/marker/marker.go @@ -1,13 +1,15 @@ package marker +import "git.sr.ht/~rjarry/aerc/models" + // Marker provides the interface for the marking behavior of messages type Marker interface { - Mark(uint32) - Unmark(uint32) - ToggleMark(uint32) + Mark(models.UID) + Unmark(models.UID) + ToggleMark(models.UID) Remark() - Marked() []uint32 - IsMarked(uint32) bool + Marked() []models.UID + IsMarked(models.UID) bool IsVisualMark() bool ToggleVisualMark(bool) UpdateVisualMark() @@ -16,30 +18,30 @@ type Marker interface { // UIDProvider provides the underlying uids and the selected message index type UIDProvider interface { - Uids() []uint32 + Uids() []models.UID SelectedIndex() int } type controller struct { uidProvider UIDProvider - marked map[uint32]struct{} - lastMarked map[uint32]struct{} - visualStartUID uint32 + marked map[models.UID]struct{} + lastMarked map[models.UID]struct{} + visualStartUID models.UID visualMarkMode bool - visualBase map[uint32]struct{} + visualBase map[models.UID]struct{} } // New returns a new Marker func New(up UIDProvider) Marker { return &controller{ uidProvider: up, - marked: make(map[uint32]struct{}), - lastMarked: make(map[uint32]struct{}), + marked: make(map[models.UID]struct{}), + lastMarked: make(map[models.UID]struct{}), } } // Mark markes the uid as marked -func (mc *controller) Mark(uid uint32) { +func (mc *controller) Mark(uid models.UID) { if mc.visualMarkMode { // visual mode has override, bogus input from user return @@ -48,7 +50,7 @@ func (mc *controller) Mark(uid uint32) { } // Unmark unmarks the uid -func (mc *controller) Unmark(uid uint32) { +func (mc *controller) Unmark(uid models.UID) { if mc.visualMarkMode { // user probably wanted to clear the visual marking mc.ClearVisualMark() @@ -63,7 +65,7 @@ func (mc *controller) Remark() { } // ToggleMark toggles the marked state for the given uid -func (mc *controller) ToggleMark(uid uint32) { +func (mc *controller) ToggleMark(uid models.UID) { if mc.visualMarkMode { // visual mode has override, bogus input from user return @@ -78,7 +80,7 @@ func (mc *controller) ToggleMark(uid uint32) { // resetMark removes the marking from all messages func (mc *controller) resetMark() { mc.lastMarked = mc.marked - mc.marked = make(map[uint32]struct{}) + mc.marked = make(map[models.UID]struct{}) } // removeStaleUID removes uids that are no longer presents in the UIDProvider @@ -98,15 +100,15 @@ func (mc *controller) removeStaleUID() { } // IsMarked checks whether the given uid has been marked -func (mc *controller) IsMarked(uid uint32) bool { +func (mc *controller) IsMarked(uid models.UID) bool { _, marked := mc.marked[uid] return marked } // Marked returns the uids of all marked messages -func (mc *controller) Marked() []uint32 { +func (mc *controller) Marked() []models.UID { mc.removeStaleUID() - marked := make([]uint32, len(mc.marked)) + marked := make([]models.UID, len(mc.marked)) i := 0 for uid := range mc.marked { marked[i] = uid @@ -132,7 +134,7 @@ func (mc *controller) ToggleVisualMark(clear bool) { if idx := mc.uidProvider.SelectedIndex(); idx >= 0 && idx < len(uids) { mc.visualStartUID = uids[idx] mc.marked[mc.visualStartUID] = struct{}{} - mc.visualBase = make(map[uint32]struct{}) + mc.visualBase = make(map[models.UID]struct{}) for key, value := range mc.marked { mc.visualBase[key] = value } @@ -144,7 +146,7 @@ func (mc *controller) ToggleVisualMark(clear bool) { func (mc *controller) ClearVisualMark() { mc.resetMark() mc.visualMarkMode = false - mc.visualStartUID = 0 + mc.visualStartUID = "" } // UpdateVisualMark updates the index with the currently selected message @@ -167,13 +169,13 @@ func (mc *controller) UpdateVisualMark() { uids := mc.uidProvider.Uids() - var visUids []uint32 + var visUids []models.UID if selectedIdx > startIdx { visUids = uids[startIdx : selectedIdx+1] } else { visUids = uids[selectedIdx : startIdx+1] } - mc.marked = make(map[uint32]struct{}) + mc.marked = make(map[models.UID]struct{}) for uid := range mc.visualBase { mc.marked[uid] = struct{}{} } diff --git a/lib/marker/marker_test.go b/lib/marker/marker_test.go index df9eb2a3..04d3fedc 100644 --- a/lib/marker/marker_test.go +++ b/lib/marker/marker_test.go @@ -4,16 +4,17 @@ import ( "testing" "git.sr.ht/~rjarry/aerc/lib/marker" + "git.sr.ht/~rjarry/aerc/models" ) // mockUidProvider implements the UidProvider interface and mocks the message // store for testing type mockUidProvider struct { - uids []uint32 + uids []models.UID idx int } -func (mock *mockUidProvider) Uids() []uint32 { +func (mock *mockUidProvider) Uids() []models.UID { return mock.uids } @@ -23,7 +24,7 @@ func (mock *mockUidProvider) SelectedIndex() int { func createMarker() (marker.Marker, *mockUidProvider) { uidProvider := &mockUidProvider{ - uids: []uint32{1, 2, 3, 4}, + uids: []models.UID{"1", "2", "3", "4"}, idx: 1, } m := marker.New(uidProvider) @@ -32,7 +33,7 @@ func createMarker() (marker.Marker, *mockUidProvider) { func TestMarker_MarkUnmark(t *testing.T) { m, _ := createMarker() - uid := uint32(4) + uid := models.UID("4") m.Mark(uid) if !m.IsMarked(uid) { @@ -47,7 +48,7 @@ func TestMarker_MarkUnmark(t *testing.T) { func TestMarker_ToggleMark(t *testing.T) { m, _ := createMarker() - uid := uint32(4) + uid := models.UID("4") if m.IsMarked(uid) { t.Errorf("ToggleMark: uid should not be marked") @@ -66,9 +67,9 @@ func TestMarker_ToggleMark(t *testing.T) { func TestMarker_Marked(t *testing.T) { m, _ := createMarker() - expected := map[uint32]struct{}{ - uint32(1): {}, - uint32(4): {}, + expected := map[models.UID]struct{}{ + "1": {}, + "4": {}, } for uid := range expected { m.Mark(uid) @@ -81,7 +82,7 @@ func TestMarker_Marked(t *testing.T) { for _, uid := range got { if _, ok := expected[uid]; !ok { - t.Errorf("Marked: received uid %d as marked but it should not be", uid) + t.Errorf("Marked: received uid %q as marked but it should not be", uid) } } } @@ -93,15 +94,15 @@ func TestMarker_VisualMode(t *testing.T) { m.ToggleVisualMark(false) // marking should now fail silently because we're in visual mode - m.Mark(1) - if m.IsMarked(1) { + m.Mark("1") + if m.IsMarked("1") { t.Errorf("marking in visual mode should not work") } // move selection index to last item up.idx = len(up.uids) - 1 m.UpdateVisualMark() - expectedMarked := []uint32{2, 3, 4} + expectedMarked := []models.UID{"2", "3", "4"} for _, uidMarked := range expectedMarked { if !m.IsMarked(uidMarked) { @@ -128,7 +129,7 @@ func TestMarker_VisualMode(t *testing.T) { func TestMarker_MarkOutOfBound(t *testing.T) { m, _ := createMarker() - outOfBoundUid := uint32(100) + outOfBoundUid := models.UID("100") m.Mark(outOfBoundUid) for _, markedUid := range m.Marked() { |