package types import ( "fmt" "io" "reflect" ) // ScanFully uses fmt.Sscanf with verb to fully scan val into ptr. func ScanFully(ptr interface{}, val string, verb byte) error { t := reflect.ValueOf(ptr).Elem().Type() // attempt to read extra bytes to make sure the value is consumed var b []byte n, err := fmt.Sscanf(val, "%"+string(verb)+"%s", ptr, &b) switch { case n < 1 || n == 1 && err != io.EOF: return fmt.Errorf("failed to parse %q as %v: %v", val, t, err) case n > 1: return fmt.Errorf("failed to parse %q as %v: extra characters %q", val, t, string(b)) } // n == 1 && err == io.EOF return nil }