in pkg/skoop/netstack/iptables.go [798:841]
func setField(s reflect.Value, fieldName string, value string) error {
t := s.Type()
if t.Kind() != reflect.Struct {
return fmt.Errorf("%s is not a struct", s)
}
_, ok := t.FieldByName(fieldName)
if !ok {
return fmt.Errorf("%s has no field %s", s, fieldName)
}
field := s.FieldByName(fieldName)
switch field.Type().Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
i, err := strconv.ParseInt(value, 10, 64)
if err != nil {
return errors.Wrap(err, fmt.Sprintf("error parse %s to int", value))
}
field.SetInt(i)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
i, err := strconv.ParseUint(value, 10, 64)
if err != nil {
return errors.Wrap(err, fmt.Sprintf("error parse %s to uint", value))
}
field.SetUint(i)
case reflect.Float32:
f, err := strconv.ParseFloat(value, 32)
if err != nil {
return errors.Wrap(err, fmt.Sprintf("error parse %s to float32", value))
}
field.SetFloat(f)
case reflect.Float64:
f, err := strconv.ParseFloat(value, 64)
if err != nil {
return errors.Wrap(err, fmt.Sprintf("error parse %s to float64", value))
}
field.SetFloat(f)
case reflect.String:
field.SetString(value)
default:
return fmt.Errorf("unsupported field type %s", field.Type().Kind().String())
}
return nil
}