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

    Projects

    Status

    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions