package prompt import ( "bufio" "fmt" "os" ) type Prompter interface { Prompt(string) } func Read[T any]() (out T, err error) { nilv := out b := bufio.NewReader(os.Stdin) s, err := b.ReadString('\n') if err != nil { return nilv, err } switch o := any(&out).(type) { case *string: *o = s[:len(s)-1] case *Prompter: (*o).Prompt(s) default: _, err = fmt.Sscan(s, &out) if err != nil { return nilv, err } } return out, nil } func MustRead[T any]() T { out, err := Read[T]() if err != nil { panic("Error during read: "+err.Error()) } return out }