mirror of
https://github.com/rwinkhart/go-boilerplate.git
synced 2026-08-27 20:36:29 -04:00
Remove (maybe temporarily) Windows-specific input functions
This commit is contained in:
@@ -1,5 +1,3 @@
|
||||
//go:build !windows
|
||||
|
||||
package front
|
||||
|
||||
import (
|
||||
@@ -1,112 +0,0 @@
|
||||
//go:build windows
|
||||
|
||||
package front
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
||||
procGetStdHandle = kernel32.NewProc("GetStdHandle")
|
||||
procPeekConsoleInput = kernel32.NewProc("PeekConsoleInputW")
|
||||
procReadConsoleInput = kernel32.NewProc("ReadConsoleInputW")
|
||||
)
|
||||
|
||||
const (
|
||||
stdInputHandle = ^uintptr(10) - 1 // STD_INPUT_HANDLE = -10
|
||||
)
|
||||
|
||||
type inputRecord struct {
|
||||
EventType uint16
|
||||
_ [2]byte // padding
|
||||
Event [16]byte
|
||||
}
|
||||
|
||||
// pollForInput checks if input is available without blocking
|
||||
func pollForInput() bool {
|
||||
handle, _, _ := procGetStdHandle.Call(stdInputHandle)
|
||||
var numEvents uint32
|
||||
var record inputRecord
|
||||
|
||||
ret, _, _ := procPeekConsoleInput.Call(
|
||||
handle,
|
||||
uintptr(unsafe.Pointer(&record)),
|
||||
1,
|
||||
uintptr(unsafe.Pointer(&numEvents)),
|
||||
)
|
||||
|
||||
return ret != 0 && numEvents > 0
|
||||
}
|
||||
|
||||
// Input prompts the user for input and
|
||||
// returns the input as a string.
|
||||
// Uses polling to be more responsive
|
||||
// to interrupts on Windows.
|
||||
func Input(prompt string) string {
|
||||
fmt.Print(prompt + " ")
|
||||
|
||||
// Poll until input is available
|
||||
for !pollForInput() {
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
}
|
||||
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
userInput, _ := reader.ReadString('\n')
|
||||
return strings.TrimRight(userInput, "\n\r ") // remove trailing newlines, carriage returns, and spaces
|
||||
}
|
||||
|
||||
// InputBinary prompts the user with a yes/no
|
||||
// question and returns the response as a boolean.
|
||||
// Uses polling to be more responsive to interrupts on Windows.
|
||||
func InputBinary(prompt string) bool {
|
||||
fmt.Print(prompt + " (y/N) ")
|
||||
|
||||
// Poll until input is available
|
||||
for !pollForInput() {
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
}
|
||||
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
char, _, _ := reader.ReadRune()
|
||||
if char == 'y' || char == 'Y' {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// InputInt prompts the user for input and returns the input as an integer.
|
||||
// A negative min/max value will disable the respective limit.
|
||||
// Uses polling to be more responsive to interrupts on Windows.
|
||||
func InputInt(prompt string, min, max int) int {
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
for {
|
||||
fmt.Print(prompt + " ")
|
||||
|
||||
// Poll until input is available
|
||||
for !pollForInput() {
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
}
|
||||
|
||||
line, err := reader.ReadString('\n')
|
||||
if err != nil {
|
||||
fmt.Println()
|
||||
continue
|
||||
}
|
||||
|
||||
line = strings.TrimSpace(line)
|
||||
userInput, err := strconv.Atoi(line)
|
||||
|
||||
if err == nil && (userInput >= min || min < 0) && (userInput <= max || max < 0) {
|
||||
return userInput
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user