Skip to content

Multiple optional arguments are not processed correctly #230

@stroiman

Description

@stroiman

Example, FormData constructor, the submitter will never be used (maybe depending on how undefined are parsed)

func FormDataConstructor[T any](cbCtx js.CallbackContext[T]) (res js.Value[T], err error) {
	form, found, errArg := js.ConsumeOptionalArg(cbCtx, "form", decodeHTMLFormElement)
	if found {
		if errArg != nil {
			return nil, errArg
		}
		return CreateFormDataForm(cbCtx, form)
	}
	submitter, found, errArg := js.ConsumeOptionalArg(cbCtx, "submitter", codec.DecodeHTMLElement)
	if found {
		if errArg != nil {
			return nil, errArg
		}
		return CreateFormDataFormSubmitter(cbCtx, form, submitter)
	}
	return CreateFormData(cbCtx)
}

Should probably have been

func FormDataConstructor[T any](cbCtx js.CallbackContext[T]) (res js.Value[T], err error) {
	form, found, errArg := js.ConsumeOptionalArg(cbCtx, "form", decodeHTMLFormElement)
	if found {
		if errArg != nil {
			return nil, errArg
		}
		submitter, found, errArg := js.ConsumeOptionalArg(cbCtx, "submitter", codec.DecodeHTMLElement)
		if found {
			if errArg != nil {
				return nil, errArg
			}
			return CreateFormDataFormSubmitter(cbCtx, form, submitter)
		}
		return CreateFormDataForm(cbCtx, form)
	}
	return CreateFormData(cbCtx)
}

I.e., the next optional argument is checked if the first exists; and parsing didn't fail.

Maybe a more readable form is

func FormDataConstructor[T any](cbCtx js.CallbackContext[T]) (res js.Value[T], err error) {
	form, formFound, formErr := js.ConsumeOptionalArg(cbCtx, "form", decodeHTMLFormElement)
	submitter, submitterFound, submitterErr := js.ConsumeOptionalArg(cbCtx, "submitter", codec.DecodeHTMLElement)
	if formFound {
		if formErr != nil {
			return nil, formErr
		}
		if submitterFound {
			if submitterErr != nil {
				return nil, submitterErr
			}
			return CreateFormDataFormSubmitter(cbCtx, form, submitter)
		}
		return CreateFormDataForm(cbCtx, form)
	}
	return CreateFormData(cbCtx)
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No fields configured for Bug.

    Projects

    Status

    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions