@@ -181,19 +181,14 @@ func (m *Model) SetValue(s string) {
181
181
// Clean up any special characters in the input provided by the
182
182
// caller. This avoids bugs due to e.g. tab characters and whatnot.
183
183
runes := m .san ().Sanitize ([]rune (s ))
184
- m .setValueInternal (runes )
184
+ err := m .validateIfDefined (string (runes ))
185
+ m .setValueInternal (runes , err )
185
186
}
186
187
187
- func (m * Model ) setValueInternal (runes []rune ) {
188
- if m .Validate != nil {
189
- if err := m .Validate (string (runes )); err != nil {
190
- m .Err = err
191
- return
192
- }
193
- }
188
+ func (m * Model ) setValueInternal (runes []rune , err error ) {
189
+ m .Err = err
194
190
195
191
empty := len (m .value ) == 0
196
- m .Err = nil
197
192
198
193
if m .CharLimit > 0 && len (runes ) > m .CharLimit {
199
194
m .value = runes [:m .CharLimit ]
@@ -307,8 +302,6 @@ func (m *Model) insertRunesFromUserInput(v []rune) {
307
302
tail := make ([]rune , len (tailSrc ))
308
303
copy (tail , tailSrc )
309
304
310
- oldPos := m .pos
311
-
312
305
// Insert pasted runes
313
306
for _ , r := range paste {
314
307
head = append (head , r )
@@ -323,11 +316,8 @@ func (m *Model) insertRunesFromUserInput(v []rune) {
323
316
324
317
// Put it all back together
325
318
value := append (head , tail ... )
326
- m .setValueInternal (value )
327
-
328
- if m .Err != nil {
329
- m .pos = oldPos
330
- }
319
+ inputErr := m .validateIfDefined (string (value ))
320
+ m .setValueInternal (value , inputErr )
331
321
}
332
322
333
323
// If a max width is defined, perform some logic to treat the visible area
@@ -378,6 +368,7 @@ func (m *Model) handleOverflow() {
378
368
// deleteBeforeCursor deletes all text before the cursor.
379
369
func (m * Model ) deleteBeforeCursor () {
380
370
m .value = m .value [m .pos :]
371
+ m .Err = m .validateIfDefined (string (m .value ))
381
372
m .offset = 0
382
373
m .SetCursor (0 )
383
374
}
@@ -387,6 +378,7 @@ func (m *Model) deleteBeforeCursor() {
387
378
// masked input.
388
379
func (m * Model ) deleteAfterCursor () {
389
380
m .value = m .value [:m .pos ]
381
+ m .Err = m .validateIfDefined (string (m .value ))
390
382
m .SetCursor (len (m .value ))
391
383
}
392
384
@@ -432,6 +424,7 @@ func (m *Model) deleteWordBackward() {
432
424
} else {
433
425
m .value = append (m .value [:m .pos ], m .value [oldPos :]... )
434
426
}
427
+ m .Err = m .validateIfDefined (string (m .value ))
435
428
}
436
429
437
430
// deleteWordForward deletes the word right to the cursor. If input is masked
@@ -471,6 +464,7 @@ func (m *Model) deleteWordForward() {
471
464
} else {
472
465
m .value = append (m .value [:oldPos ], m .value [m .pos :]... )
473
466
}
467
+ m .Err = m .validateIfDefined (string (m .value ))
474
468
475
469
m .SetCursor (oldPos )
476
470
}
@@ -575,12 +569,12 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
575
569
case tea.KeyMsg :
576
570
switch {
577
571
case key .Matches (msg , m .KeyMap .DeleteWordBackward ):
578
- m .Err = nil
579
572
m .deleteWordBackward ()
580
573
case key .Matches (msg , m .KeyMap .DeleteCharacterBackward ):
581
574
m .Err = nil
582
575
if len (m .value ) > 0 {
583
576
m .value = append (m .value [:max (0 , m .pos - 1 )], m .value [m .pos :]... )
577
+ m .Err = m .validateIfDefined (string (m .value ))
584
578
if m .pos > 0 {
585
579
m .SetCursor (m .pos - 1 )
586
580
}
@@ -597,13 +591,12 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
597
591
if m .pos < len (m .value ) {
598
592
m .SetCursor (m .pos + 1 )
599
593
}
600
- case key .Matches (msg , m .KeyMap .DeleteWordBackward ):
601
- m .deleteWordBackward ()
602
594
case key .Matches (msg , m .KeyMap .LineStart ):
603
595
m .CursorStart ()
604
596
case key .Matches (msg , m .KeyMap .DeleteCharacterForward ):
605
597
if len (m .value ) > 0 && m .pos < len (m .value ) {
606
598
m .value = append (m .value [:m .pos ], m .value [m .pos + 1 :]... )
599
+ m .Err = m .validateIfDefined (string (m .value ))
607
600
}
608
601
case key .Matches (msg , m .KeyMap .LineEnd ):
609
602
m .CursorEnd ()
@@ -884,3 +877,10 @@ func (m *Model) previousSuggestion() {
884
877
m .currentSuggestionIndex = len (m .matchedSuggestions ) - 1
885
878
}
886
879
}
880
+
881
+ func (m Model ) validateIfDefined (v string ) error {
882
+ if m .Validate != nil {
883
+ return m .Validate (v )
884
+ }
885
+ return nil
886
+ }
0 commit comments