func FromUserProp()

in go/protocol/internal/errutil/protocol.go [121:224]


func FromUserProp(user map[string]string) error {
	status := user[constants.Status]
	statusMessage := user[constants.StatusMessage]
	propertyName := user[constants.InvalidPropertyName]
	propertyValue := user[constants.InvalidPropertyValue]
	protocolVersion := user[constants.RequestProtocolVersion]
	supportedVersions := user[constants.SupportedProtocolMajorVersion]

	if status == "" {
		return &errors.Client{
			Message: "status missing",
			Kind: errors.HeaderMissing{
				HeaderName: constants.Status,
			},
		}
	}

	code, err := strconv.ParseInt(status, 10, 32)
	if err != nil {
		return &errors.Client{
			Message: "status is not a valid integer",
			Kind: errors.HeaderInvalid{
				HeaderName:  constants.Status,
				HeaderValue: status,
			},
			Nested: err,
		}
	}

	// No error, we're done.
	if code < 400 {
		return nil
	}

	e := &errors.Remote{Message: statusMessage}

	switch code {
	case 400, 415:
		switch {
		case propertyName == "" && propertyValue == "":
			e.Kind = errors.PayloadInvalid{}
		case propertyValue == "":
			e.Kind = errors.HeaderMissing{
				HeaderName: propertyName,
			}
		default:
			e.Kind = errors.HeaderInvalid{
				HeaderName:  propertyName,
				HeaderValue: propertyValue,
			}
		}
	case 408:
		to, err := duration.Parse(propertyValue)
		if err != nil {
			return &errors.Client{
				Message: "invalid timeout value",
				Kind: errors.HeaderInvalid{
					HeaderName:  constants.InvalidPropertyValue,
					HeaderValue: propertyValue,
				},
				Nested: err,
			}
		}
		e.Kind = errors.Timeout{
			TimeoutName:  propertyName,
			TimeoutValue: to.ToTimeDuration(),
		}
	case 500:
		appErr := user[constants.IsApplicationError]
		switch {
		case appErr != "" && appErr != "false":
			e.Kind = errors.ExecutionError{}
		case propertyName != "":
			e.Kind = errors.InternalLogicError{PropertyName: propertyName}
		default:
			e.Kind = errors.UnknownError{}
		}
	case 503:
		e.Kind = errors.StateInvalid{
			PropertyName: propertyName,
		}
	case 505:
		e.Kind = errors.UnsupportedVersion{
			ProtocolVersion: protocolVersion,
			SupportedMajorProtocolVersions: version.ParseSupported(
				supportedVersions,
			),
		}
	default:
		// Treat unknown status as an unknown error, but otherwise allow them.
		k := errors.UnknownError{}

		//nolint:staticcheck // Capture 422 data for schemaregistry.
		k.PropertyName = propertyName
		if propertyValue != "" {
			//nolint:staticcheck // Capture 422 data for schemaregistry.
			k.PropertyValue = propertyValue
		}

		e.Kind = k
	}

	return e
}