searcherside/internal/cli/password_mapper.go

44 lines
766 B
Go
Raw Permalink Normal View History

package cli
import (
"bufio"
"fmt"
"os"
"reflect"
"github.com/alecthomas/kong"
)
var _ kong.Mapper = (*PasswordMapper)(nil)
type PasswordMapper struct {
}
func (p PasswordMapper) Decode(ctx *kong.DecodeContext, target reflect.Value) error {
token := ctx.Scan.Pop()
switch v := token.Value.(type) {
case []byte:
target.SetBytes(v)
case string:
if len(v) == 0 {
return nil
}
if v == "-" {
scanner := bufio.NewScanner(os.Stdin)
if scanner.Scan() {
target.SetBytes(scanner.Bytes())
return nil
} else {
return fmt.Errorf("failed to read password from stdin: %v", scanner.Err())
}
}
target.SetBytes([]byte(v))
default:
return fmt.Errorf("expected bool but got %q (%T)", token.Value, token.Value)
}
return nil
}