Module forms
Form controls (HTML forms): values, checkedness, validity, selection, select / option / form members, focus, and FormData. Members shared by several interfaces are one function imported under each interface's name (HTMLInputElement_value, HTMLTextAreaElement_value...): it accepts any control and does what HTML says for its kind.
- selection positions are UTF-16 code units, as in JavaScript; -1 means null (the API does not apply);
- valueAsDate is milliseconds since the epoch, NaN for null;
- events: InputEvent.data is Event_data, inputType Event_text; SubmitEvent.submitter, FocusEvent.relatedTarget and FormDataEvent.formData are Event_object.
Exposed to: Window. Source: api/forms.widl.
Odin: import "wren:forms".
Types
handle FormData : Object
Checked by the browser on every call (lookup_FormData).
flags ValidityState : u32
ValidityState: every flag that is set (none = valid).
| member | bit | |
|---|---|---|
Value_Missing | 0 | |
Type_Mismatch | 1 | |
Pattern_Mismatch | 2 | |
Too_Long | 3 | |
Too_Short | 4 | |
Range_Underflow | 5 | |
Range_Overflow | 6 | |
Step_Mismatch | 7 | |
Bad_Input | 8 | |
Custom_Error | 9 |
enum SelectionDirection : i32
| member | value | |
|---|---|---|
None | 0 | |
Forward | 1 | |
Backward | 2 |
enum SelectionMode : i32
setRangeText's selectMode.
| member | value | |
|---|---|---|
Preserve | 0 | |
Select | 1 | |
Start | 2 | |
End | 3 |
enum FormEnctype : i32
How a FormData body is encoded.
| member | value | |
|---|---|---|
Multipart | 0 | |
Urlencoded | 1 | |
Text_Plain | 2 |
Functions
HTMLInputElement_value
string value(Element control)control.value
Imported as HTMLInputElement_value, HTMLTextAreaElement_value, HTMLSelectElement_value, HTMLButtonElement_value, HTMLOptionElement_value, HTMLOutputElement_value.
Host: forms_value :: proc(c: ^Call, control: Api_Element) -> string
HTMLInputElement_setValue
void setValue(Element control, string value) raisescontrol.value = value: Invalid_State for a file input given anything but "".
Imported as HTMLInputElement_setValue, HTMLTextAreaElement_setValue, HTMLSelectElement_setValue, HTMLButtonElement_setValue, HTMLOptionElement_setValue, HTMLOutputElement_setValue.
Raises: returns an Error (see web).
Host: forms_setValue :: proc(c: ^Call, control: Api_Element, value: string) -> Api_Error
HTMLInputElement_defaultValue
string defaultValue(Element control)Imported as HTMLInputElement_defaultValue, HTMLTextAreaElement_defaultValue, HTMLOutputElement_defaultValue.
Host: forms_defaultValue :: proc(c: ^Call, control: Api_Element) -> string
HTMLInputElement_setDefaultValue
void setDefaultValue(Element control, string value) raisesImported as HTMLInputElement_setDefaultValue, HTMLTextAreaElement_setDefaultValue, HTMLOutputElement_setDefaultValue.
Raises: returns an Error (see web).
Host: forms_setDefaultValue :: proc(c: ^Call, control: Api_Element, value: string) -> Api_Error
HTMLInputElement_checked
bool checked(Element control)Host: forms_checked :: proc(c: ^Call, control: Api_Element) -> bool
HTMLInputElement_setChecked
void setChecked(Element control, bool checked) raisesRaises: returns an Error (see web).
Host: forms_setChecked :: proc(c: ^Call, control: Api_Element, checked: bool) -> Api_Error
HTMLInputElement_defaultChecked
bool defaultChecked(Element control)Host: forms_defaultChecked :: proc(c: ^Call, control: Api_Element) -> bool
HTMLInputElement_setDefaultChecked
void setDefaultChecked(Element control, bool checked)Host: forms_setDefaultChecked :: proc(c: ^Call, control: Api_Element, checked: bool)
HTMLInputElement_indeterminate
bool indeterminate(Element control)Host: forms_indeterminate :: proc(c: ^Call, control: Api_Element) -> bool
HTMLInputElement_setIndeterminate
void setIndeterminate(Element control, bool indeterminate)Host: forms_setIndeterminate :: proc(c: ^Call, control: Api_Element, indeterminate: bool)
HTMLInputElement_type
string type(Element control)control.type
Imported as HTMLInputElement_type, HTMLTextAreaElement_type, HTMLSelectElement_type, HTMLButtonElement_type, HTMLOutputElement_type, HTMLFieldSetElement_type, HTMLObjectElement_type.
Host: forms_type :: proc(c: ^Call, control: Api_Element) -> string
HTMLInputElement_name
string name(Element control)control.name
Imported as HTMLInputElement_name, HTMLTextAreaElement_name, HTMLSelectElement_name, HTMLButtonElement_name, HTMLOutputElement_name, HTMLFieldSetElement_name, HTMLObjectElement_name.
Host: forms_name :: proc(c: ^Call, control: Api_Element) -> string
HTMLInputElement_form
Element form(Element control)The form owner (null when none).
Imported as HTMLInputElement_form, HTMLTextAreaElement_form, HTMLSelectElement_form, HTMLButtonElement_form, HTMLOutputElement_form, HTMLFieldSetElement_form, HTMLObjectElement_form, HTMLOptionElement_form, HTMLLabelElement_form, HTMLLegendElement_form.
Host: forms_form :: proc(c: ^Call, control: Api_Element) -> u64
HTMLInputElement_disabled
bool disabled(Element control)Imported as HTMLInputElement_disabled, HTMLTextAreaElement_disabled, HTMLSelectElement_disabled, HTMLButtonElement_disabled, HTMLFieldSetElement_disabled, HTMLOptionElement_disabled, HTMLOptGroupElement_disabled.
Host: forms_disabled :: proc(c: ^Call, control: Api_Element) -> bool
HTMLInputElement_setDisabled
void setDisabled(Element control, bool disabled)Imported as HTMLInputElement_setDisabled, HTMLTextAreaElement_setDisabled, HTMLSelectElement_setDisabled, HTMLButtonElement_setDisabled, HTMLFieldSetElement_setDisabled, HTMLOptionElement_setDisabled, HTMLOptGroupElement_setDisabled.
Host: forms_setDisabled :: proc(c: ^Call, control: Api_Element, disabled: bool)
HTMLInputElement_readOnly
bool readOnly(Element control)Imported as HTMLInputElement_readOnly, HTMLTextAreaElement_readOnly.
Host: forms_readOnly :: proc(c: ^Call, control: Api_Element) -> bool
HTMLInputElement_setReadOnly
void setReadOnly(Element control, bool read_only)Imported as HTMLInputElement_setReadOnly, HTMLTextAreaElement_setReadOnly.
Host: forms_setReadOnly :: proc(c: ^Call, control: Api_Element, read_only: bool)
HTMLInputElement_required
bool required(Element control)Imported as HTMLInputElement_required, HTMLTextAreaElement_required, HTMLSelectElement_required.
Host: forms_required :: proc(c: ^Call, control: Api_Element) -> bool
HTMLInputElement_setRequired
void setRequired(Element control, bool required)Imported as HTMLInputElement_setRequired, HTMLTextAreaElement_setRequired, HTMLSelectElement_setRequired.
Host: forms_setRequired :: proc(c: ^Call, control: Api_Element, required: bool)
HTMLInputElement_willValidate
bool willValidate(Element control)Imported as HTMLInputElement_willValidate, HTMLTextAreaElement_willValidate, HTMLSelectElement_willValidate, HTMLButtonElement_willValidate, HTMLOutputElement_willValidate, HTMLFieldSetElement_willValidate, HTMLObjectElement_willValidate.
Host: forms_willValidate :: proc(c: ^Call, control: Api_Element) -> bool
HTMLInputElement_validity
ValidityState validity(Element control)control.validity
Imported as HTMLInputElement_validity, HTMLTextAreaElement_validity, HTMLSelectElement_validity, HTMLButtonElement_validity, HTMLOutputElement_validity, HTMLFieldSetElement_validity, HTMLObjectElement_validity.
Host: forms_validity :: proc(c: ^Call, control: Api_Element) -> Api_ValidityState
HTMLInputElement_validationMessage
string validationMessage(Element control)Imported as HTMLInputElement_validationMessage, HTMLTextAreaElement_validationMessage, HTMLSelectElement_validationMessage, HTMLButtonElement_validationMessage, HTMLOutputElement_validationMessage, HTMLFieldSetElement_validationMessage, HTMLObjectElement_validationMessage.
Host: forms_validationMessage :: proc(c: ^Call, control: Api_Element) -> string
HTMLInputElement_setCustomValidity
void setCustomValidity(Element control, string message)Imported as HTMLInputElement_setCustomValidity, HTMLTextAreaElement_setCustomValidity, HTMLSelectElement_setCustomValidity, HTMLButtonElement_setCustomValidity, HTMLOutputElement_setCustomValidity, HTMLFieldSetElement_setCustomValidity, HTMLObjectElement_setCustomValidity.
Host: forms_setCustomValidity :: proc(c: ^Call, control: Api_Element, message: string)
HTMLInputElement_checkValidity
bool checkValidity(Element control)checkValidity(): fires "invalid" when it is not valid.
Imported as HTMLInputElement_checkValidity, HTMLTextAreaElement_checkValidity, HTMLSelectElement_checkValidity, HTMLButtonElement_checkValidity, HTMLOutputElement_checkValidity, HTMLFieldSetElement_checkValidity, HTMLObjectElement_checkValidity, HTMLFormElement_checkValidity.
Host: forms_checkValidity :: proc(c: ^Call, control: Api_Element) -> bool
HTMLInputElement_reportValidity
bool reportValidity(Element control)reportValidity(): also shows the problem to the user.
Imported as HTMLInputElement_reportValidity, HTMLTextAreaElement_reportValidity, HTMLSelectElement_reportValidity, HTMLButtonElement_reportValidity, HTMLOutputElement_reportValidity, HTMLFieldSetElement_reportValidity, HTMLObjectElement_reportValidity, HTMLFormElement_reportValidity.
Host: forms_reportValidity :: proc(c: ^Call, control: Api_Element) -> bool
HTMLInputElement_select
void select(Element control) raisesImported as HTMLInputElement_select, HTMLTextAreaElement_select.
Raises: returns an Error (see web).
Host: forms_select :: proc(c: ^Call, control: Api_Element) -> Api_Error
HTMLInputElement_selectionStart
i32 selectionStart(Element control)Imported as HTMLInputElement_selectionStart, HTMLTextAreaElement_selectionStart.
Host: forms_selectionStart :: proc(c: ^Call, control: Api_Element) -> i32
HTMLInputElement_selectionEnd
i32 selectionEnd(Element control)Imported as HTMLInputElement_selectionEnd, HTMLTextAreaElement_selectionEnd.
Host: forms_selectionEnd :: proc(c: ^Call, control: Api_Element) -> i32
HTMLInputElement_selectionDirection
string selectionDirection(Element control) raises"forward", "backward" or "none". Invalid_State when the control has no selection.
Imported as HTMLInputElement_selectionDirection, HTMLTextAreaElement_selectionDirection.
Raises: returns an Error (see web).
Host: forms_selectionDirection :: proc(c: ^Call, control: Api_Element) -> (string, Api_Error)
HTMLInputElement_setSelectionRange
void setSelectionRange(Element control, i32 start, i32 end, SelectionDirection direction = None) raisesImported as HTMLInputElement_setSelectionRange, HTMLTextAreaElement_setSelectionRange.
Raises: returns an Error (see web).
Host: forms_setSelectionRange :: proc(c: ^Call, control: Api_Element, start: i32, end: i32, direction: Api_SelectionDirection) -> Api_Error
HTMLInputElement_setRangeText
void setRangeText(Element control, string text, i32 start = -1, i32 end = -1, SelectionMode mode = Preserve) raisessetRangeText(text, start, end, mode): start / end < 0 use the selection.
Imported as HTMLInputElement_setRangeText, HTMLTextAreaElement_setRangeText.
Raises: returns an Error (see web).
Host: forms_setRangeText :: proc(c: ^Call, control: Api_Element, text: string, start: i32, end: i32, mode: Api_SelectionMode) -> Api_Error
HTMLInputElement_maxLength
i32 maxLength(Element control)Imported as HTMLInputElement_maxLength, HTMLTextAreaElement_maxLength.
Host: forms_maxLength :: proc(c: ^Call, control: Api_Element) -> i32
HTMLInputElement_minLength
i32 minLength(Element control)Imported as HTMLInputElement_minLength, HTMLTextAreaElement_minLength.
Host: forms_minLength :: proc(c: ^Call, control: Api_Element) -> i32
HTMLInputElement_stepUp
void stepUp(Element control, i32 count = 1) raisesRaises: returns an Error (see web).
Host: forms_stepUp :: proc(c: ^Call, control: Api_Element, count: i32) -> Api_Error
HTMLInputElement_stepDown
void stepDown(Element control, i32 count = 1) raisesRaises: returns an Error (see web).
Host: forms_stepDown :: proc(c: ^Call, control: Api_Element, count: i32) -> Api_Error
HTMLInputElement_valueAsNumber
f64 valueAsNumber(Element control)Host: forms_valueAsNumber :: proc(c: ^Call, control: Api_Element) -> f64
HTMLInputElement_setValueAsNumber
void setValueAsNumber(Element control, f64 value) raisesRaises: returns an Error (see web).
Host: forms_setValueAsNumber :: proc(c: ^Call, control: Api_Element, value: f64) -> Api_Error
HTMLInputElement_valueAsDate
f64 valueAsDate(Element control)NaN for null.
Host: forms_valueAsDate :: proc(c: ^Call, control: Api_Element) -> f64
HTMLInputElement_setValueAsDate
void setValueAsDate(Element control, f64 ms) raisesNaN sets null.
Raises: returns an Error (see web).
Host: forms_setValueAsDate :: proc(c: ^Call, control: Api_Element, ms: f64) -> Api_Error
HTMLInputElement_files_length
i32 files_length(Element control)input.files.length
Host: forms_files_length :: proc(c: ^Call, control: Api_Element) -> i32
HTMLInputElement_fileName
string fileName(Element control, i32 index) raisesRaises: returns an Error (see web).
Host: forms_fileName :: proc(c: ^Call, control: Api_Element, index: i32) -> (string, Api_Error)
HTMLInputElement_fileSize
i64 fileSize(Element control, i32 index)-1 past the end.
Host: forms_fileSize :: proc(c: ^Call, control: Api_Element, index: i32) -> i64
HTMLInputElement_fileType
string fileType(Element control, i32 index) raisesRaises: returns an Error (see web).
Host: forms_fileType :: proc(c: ^Call, control: Api_Element, index: i32) -> (string, Api_Error)
HTMLSelectElement_selectedIndex
i32 HTMLSelectElement_selectedIndex(Element select)Host: HTMLSelectElement_selectedIndex :: proc(c: ^Call, select: Api_Element) -> i32
HTMLSelectElement_setSelectedIndex
void HTMLSelectElement_setSelectedIndex(Element select, i32 index) raisesInvalid_Handle when it is not a select.
Raises: returns an Error (see web).
Host: HTMLSelectElement_setSelectedIndex :: proc(c: ^Call, select: Api_Element, index: i32) -> Api_Error
HTMLSelectElement_length
i32 HTMLSelectElement_length(Element select)Host: HTMLSelectElement_length :: proc(c: ^Call, select: Api_Element) -> i32
HTMLSelectElement_item
Element HTMLSelectElement_item(Element select, i32 index)select.item(index): null past the end.
Host: HTMLSelectElement_item :: proc(c: ^Call, select: Api_Element, index: i32) -> u64
HTMLSelectElement_selectedOptions_length
i32 HTMLSelectElement_selectedOptions_length(Element select)Host: HTMLSelectElement_selectedOptions_length :: proc(c: ^Call, select: Api_Element) -> i32
HTMLSelectElement_selectedOptions_item
Element HTMLSelectElement_selectedOptions_item(Element select, i32 index)Host: HTMLSelectElement_selectedOptions_item :: proc(c: ^Call, select: Api_Element, index: i32) -> u64
HTMLOptionElement_selected
bool HTMLOptionElement_selected(Element option)Host: HTMLOptionElement_selected :: proc(c: ^Call, option: Api_Element) -> bool
HTMLOptionElement_setSelected
void HTMLOptionElement_setSelected(Element option, bool selected) raisesRaises: returns an Error (see web).
Host: HTMLOptionElement_setSelected :: proc(c: ^Call, option: Api_Element, selected: bool) -> Api_Error
HTMLOptionElement_defaultSelected
bool HTMLOptionElement_defaultSelected(Element option)Host: HTMLOptionElement_defaultSelected :: proc(c: ^Call, option: Api_Element) -> bool
HTMLOptionElement_setDefaultSelected
void HTMLOptionElement_setDefaultSelected(Element option, bool selected) raisesRaises: returns an Error (see web).
Host: HTMLOptionElement_setDefaultSelected :: proc(c: ^Call, option: Api_Element, selected: bool) -> Api_Error
HTMLOptionElement_index
i32 HTMLOptionElement_index(Element option)Host: HTMLOptionElement_index :: proc(c: ^Call, option: Api_Element) -> i32
HTMLOptionElement_text
string HTMLOptionElement_text(Element option)Host: HTMLOptionElement_text :: proc(c: ^Call, option: Api_Element) -> string
HTMLOptionElement_label
string HTMLOptionElement_label(Element option)Host: HTMLOptionElement_label :: proc(c: ^Call, option: Api_Element) -> string
HTMLFormElement_submit
void HTMLFormElement_submit(Element form) raisesform.submit(): no submit event, no validation.
Raises: returns an Error (see web).
Host: HTMLFormElement_submit :: proc(c: ^Call, form: Api_Element) -> Api_Error
HTMLFormElement_requestSubmit
void HTMLFormElement_requestSubmit(Element form, optional Element submitter) raisesform.requestSubmit(submitter)
Raises: returns an Error (see web).
Host: HTMLFormElement_requestSubmit :: proc(c: ^Call, form: Api_Element, submitter: Api_Element) -> Api_Error
HTMLFormElement_reset
void HTMLFormElement_reset(Element form) raisesRaises: returns an Error (see web).
Host: HTMLFormElement_reset :: proc(c: ^Call, form: Api_Element) -> Api_Error
HTMLFormElement_length
i32 HTMLFormElement_length(Element form)Host: HTMLFormElement_length :: proc(c: ^Call, form: Api_Element) -> i32
HTMLFormElement_elements
Element HTMLFormElement_elements(Element form, i32 index)form.elements[index]: null past the end.
Host: HTMLFormElement_elements :: proc(c: ^Call, form: Api_Element, index: i32) -> u64
HTMLFormElement_namedItem
Element HTMLFormElement_namedItem(Element form, string name)form.elements.namedItem(name): the first owned element whose id or name is name (null when none).
Host: HTMLFormElement_namedItem :: proc(c: ^Call, form: Api_Element, name: string) -> u64
HTMLLabelElement_control
Element HTMLLabelElement_control(Element label)label.control (null when none).
Host: HTMLLabelElement_control :: proc(c: ^Call, label: Api_Element) -> u64
HTMLElement_focus
bool HTMLElement_focus(Element element)element.focus(): whether it got the focus.
Host: HTMLElement_focus :: proc(c: ^Call, element: Api_Element) -> bool
HTMLElement_blur
void HTMLElement_blur(Element element)Host: HTMLElement_blur :: proc(c: ^Call, element: Api_Element)
HTMLElement_click
bool HTMLElement_click(Element element)element.click(): false when the click was cancelled.
Host: HTMLElement_click :: proc(c: ^Call, element: Api_Element) -> bool
Document_activeElement
Element Document_activeElement()document.activeElement (the body when nothing has the focus).
Host: Document_activeElement :: proc(c: ^Call) -> u64
HTMLDialogElement_returnValue
string HTMLDialogElement_returnValue(Element dialog)Host: HTMLDialogElement_returnValue :: proc(c: ^Call, dialog: Api_Element) -> string
HTMLDialogElement_set_returnValue
void HTMLDialogElement_set_returnValue(Element dialog, string value)Host: HTMLDialogElement_set_returnValue :: proc(c: ^Call, dialog: Api_Element, value: string)
FormData_create
FormData FormData_create(optional Element form, optional Element submitter) raisesnew FormData(form, submitter): both optional. Invalid_Handle when form is not a form or submitter not one of its submit buttons, Invalid_State while the form is constructing its entry list.
Raises: returns an Error (see web).
Host: FormData_create :: proc(c: ^Call, form: Api_Element, submitter: Api_Element) -> (u64, Api_Error)
FormData_append
void FormData_append(FormData data, usvstring name, usvstring value) raisesInvalid_Argument past forms.max_entries.
Raises: returns an Error (see web).
Host: FormData_append :: proc(c: ^Call, data: Api_FormData, name: string, value: string) -> Api_Error
FormData_appendBlob
void FormData_appendBlob(FormData data, usvstring name, Buffer blob, usvstring filename = "", string mime = "") raisesappend(name, blob, filename): the bytes of a buffer as a file entry ("blob" when no file name is given).
Raises: returns an Error (see web).
Host: FormData_appendBlob :: proc(c: ^Call, data: Api_FormData, name: string, blob: Api_Buffer, filename: string, mime: string) -> Api_Error
FormData_set
void FormData_set(FormData data, usvstring name, usvstring value) raisesset(name, value): replaces the first entry of that name and removes the others.
Raises: returns an Error (see web).
Host: FormData_set :: proc(c: ^Call, data: Api_FormData, name: string, value: string) -> Api_Error
FormData_delete
void FormData_delete(FormData data, string name)Host: FormData_delete :: proc(c: ^Call, data: Api_FormData, name: string)
FormData_has
bool FormData_has(FormData data, string name)Host: FormData_has :: proc(c: ^Call, data: Api_FormData, name: string) -> bool
FormData_count
i32 FormData_count(FormData data, string name)getAll(name).length
Host: FormData_count :: proc(c: ^Call, data: Api_FormData, name: string) -> i32
FormData_get
string FormData_get(FormData data, string name) raisesget(name): the value (a file entry gives its file name). Not_Found when absent.
Raises: returns an Error (see web).
Host: FormData_get :: proc(c: ^Call, data: Api_FormData, name: string) -> (string, Api_Error)
FormData_getAt
string FormData_getAt(FormData data, string name, i32 index) raisesgetAll(name)[index]
Raises: returns an Error (see web).
Host: FormData_getAt :: proc(c: ^Call, data: Api_FormData, name: string, index: i32) -> (string, Api_Error)
FormData_size
i32 FormData_size(FormData data)The number of entries.
Host: FormData_size :: proc(c: ^Call, data: Api_FormData) -> i32
FormData_nameAt
string FormData_nameAt(FormData data, i32 index) raisesRaises: returns an Error (see web).
Host: FormData_nameAt :: proc(c: ^Call, data: Api_FormData, index: i32) -> (string, Api_Error)
FormData_valueAt
string FormData_valueAt(FormData data, i32 index) raisesRaises: returns an Error (see web).
Host: FormData_valueAt :: proc(c: ^Call, data: Api_FormData, index: i32) -> (string, Api_Error)
FormData_isFileAt
bool FormData_isFileAt(FormData data, i32 index) raisesRaises: returns an Error (see web).
Host: FormData_isFileAt :: proc(c: ^Call, data: Api_FormData, index: i32) -> (bool, Api_Error)
FormData_fileSizeAt
i64 FormData_fileSizeAt(FormData data, i32 index)-1 for a non-file entry or past the end.
Host: FormData_fileSizeAt :: proc(c: ^Call, data: Api_FormData, index: i32) -> i64
FormData_fileTypeAt
string FormData_fileTypeAt(FormData data, i32 index) raisesRaises: returns an Error (see web).
Host: FormData_fileTypeAt :: proc(c: ^Call, data: Api_FormData, index: i32) -> (string, Api_Error)
FormData_fileAt
Buffer FormData_fileAt(FormData data, i32 index) raisesThe bytes of the index-th entry, a file (a file chosen in an <input type=file> is read now). Not_Found when there is no such entry or it is not a file.
Raises: returns an Error (see web).
Host: FormData_fileAt :: proc(c: ^Call, data: Api_FormData, index: i32) -> (u64, Api_Error)
FormData_setBlob
void FormData_setBlob(FormData data, usvstring name, Buffer blob, usvstring filename = "", string mime = "") raisesset(name, blob, filename): like FormData_set with a file entry.
Raises: returns an Error (see web).
Host: FormData_setBlob :: proc(c: ^Call, data: Api_FormData, name: string, blob: Api_Buffer, filename: string, mime: string) -> Api_Error
FormData_encode
Buffer FormData_encode(FormData data, string boundary) raisesThe entries as a multipart/form-data body with this boundary (files chosen in an <input type=file> are read now).
Raises: returns an Error (see web).
Host: FormData_encode :: proc(c: ^Call, data: Api_FormData, boundary: string) -> (u64, Api_Error)