1package types 2 3import ( 4 "fmt" 5 "io" 6 "reflect" 7) 8 9// ScanFully uses fmt.Sscanf with verb to fully scan val into ptr. 10func ScanFully(ptr interface{}, val string, verb byte) error { 11 t := reflect.ValueOf(ptr).Elem().Type() 12 // attempt to read extra bytes to make sure the value is consumed 13 var b []byte 14 n, err := fmt.Sscanf(val, "%"+string(verb)+"%s", ptr, &b) 15 switch { 16 case n < 1 || n == 1 && err != io.EOF: 17 return fmt.Errorf("failed to parse %q as %v: %v", val, t, err) 18 case n > 1: 19 return fmt.Errorf("failed to parse %q as %v: extra characters %q", val, t, string(b)) 20 } 21 // n == 1 && err == io.EOF 22 return nil 23} 24