func setField()

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
}