@@ -17,37 +17,38 @@ func PromptMaskedWithAsterisks(stdin *os.File) (string, error) {
1717 if err != nil {
1818 return "" , fmt .Errorf ("failed to set raw terminal: %w" , err )
1919 }
20- defer term .Restore (fd , oldState )
20+ defer func () { _ = term .Restore (fd , oldState ) }( )
2121 return readMaskedInput (stdin , os .Stderr )
2222}
2323
2424// readMaskedInput reads bytes one at a time from r, echoing '*' to echo for each
2525// printable character. Handles backspace, Ctrl+C, and Enter.
2626func readMaskedInput (r io.Reader , echo io.Writer ) (string , error ) {
2727 var buf []byte
28- b := make ([ ]byte , 1 )
28+ var b [ 1 ]byte
2929 for {
30- if _ , err := r . Read ( b ); err != nil {
30+ if _ , err := io . ReadFull ( r , b [:] ); err != nil {
3131 fmt .Fprint (echo , "\r \n " )
32- if err == io .EOF {
32+ if err == io .EOF || err == io . ErrUnexpectedEOF {
3333 return string (buf ), nil
3434 }
3535 return "" , fmt .Errorf ("failed to read input: %w" , err )
3636 }
37+ ch := b [0 ]
3738 switch {
38- case b [ 0 ] == 3 : // Ctrl+C
39+ case ch == 3 : // Ctrl+C
3940 fmt .Fprint (echo , "\r \n " )
4041 return "" , fmt .Errorf ("interrupted" )
41- case b [ 0 ] == 13 || b [ 0 ] == 10 : // Enter
42+ case ch == 13 || ch == 10 : // Enter
4243 fmt .Fprint (echo , "\r \n " )
4344 return string (buf ), nil
44- case b [ 0 ] == 127 || b [ 0 ] == 8 : // Backspace / Delete
45+ case ch == 127 || ch == 8 : // Backspace / Delete
4546 if len (buf ) > 0 {
4647 buf = buf [:len (buf )- 1 ]
4748 fmt .Fprint (echo , "\b \b " )
4849 }
49- case b [ 0 ] >= 32 && b [ 0 ] < 127 : // Printable ASCII
50- buf = append (buf , b [ 0 ] )
50+ case ch >= 32 && ch < 127 : // Printable ASCII
51+ buf = append (buf , ch )
5152 fmt .Fprint (echo , "*" )
5253 }
5354 }
0 commit comments