123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452 |
- package door
- import (
- "fmt"
- "log"
- "strconv"
- "strings"
- "time"
- "unicode"
- )
- const DEBUG_INPUT = true
- var ErrInactivity error = fmt.Errorf("Inactivity")
- var ErrTimeout error = fmt.Errorf("Timeout")
- var ErrDisconnected error = fmt.Errorf("Disconnected")
- var DefaultTimeout time.Duration = time.Duration(60) * time.Second
- func (d *Door) WaitKey(timeout time.Duration) (rune, Extended, error) {
-
-
- select {
- case r, ok := <-d.readerChannel:
- if ok {
- if DEBUG_INPUT {
- log.Println("WaitKey:", r)
- }
-
- return r.R, r.Ex, r.Err
- } else {
- log.Println("WaitKey: Disconnected")
-
-
- return 0, NOP, ErrDisconnected
- }
- case <-time.After(timeout):
- return 0, NOP, ErrTimeout
- }
- }
- func DisplayInput(max int) string {
- return strings.Repeat(" ", max) + strings.Repeat("\x08", max)
- }
- func (d *Door) Input(max int) string {
- var line []rune = make([]rune, 0, max)
- var length int
-
- d.Write(DisplayInput(max))
- var r rune
- var ex Extended
- var err error
- for {
- r, ex, err = d.WaitKey(DefaultTimeout)
- if err != nil {
-
- return ""
- }
- if ex != NOP {
- continue
- }
- uw := UnicodeWidth(r)
- if strconv.IsPrint(r) {
- if length+uw <= max {
- d.Write(string(r))
- line = append(line, r)
- length += uw
- } else {
- d.Write("\x07")
- }
- } else {
-
- switch r {
- case 0x7f, 0x08:
- if len(line) > 0 {
- d.Write("\x08 \x08")
- rlen := len(line)
- if UnicodeWidth(line[rlen-1]) == 2 {
- d.Write("\x08 \x08")
- length -= 2
- } else {
- length--
- }
- line = line[0 : rlen-1]
- }
- case 0x0d:
- return string(line)
- }
- }
- }
- }
- func (d *Door) GetOneOf(possible string) rune {
- var r rune
- var err error
- for {
- r, _, err = d.WaitKey(DefaultTimeout)
- if err != nil {
- return rune(0)
- }
- r := unicode.ToUpper(r)
- if strings.ContainsRune(possible, r) {
-
- return r
- }
-
- }
- }
|