Skip to main content

src/gflare_ffi_form_data.mjs

import { Ok, Error, List } from "./gleam.mjs";

class GleamText {
  constructor(value) {
    this.Text = value;
  }
}

class GleamFile {
  constructor(filename, content_type, data) {
    this.File = [filename, content_type, data];
  }
}

function to_form_field(val) {
  if (typeof val === "string") return new GleamText(val);
  return new GleamFile(
    val.name || null,
    val.type || null,
    new Uint8Array(val),
  );
}

function entries_to_list(entries) {
  return List.fromArray(
    entries.map(([key, val]) => [key, to_form_field(val)]),
  );
}

export async function parse_form_data(request) {
  try {
    const fd = await request.formData();
    const entries = [];
    for (const [key, val] of fd.entries()) {
      entries.push([key, to_form_field(val)]);
    }
    return new Ok({ FormData: List.fromArray(entries) });
  } catch (e) {
    return new Error(`${e}`);
  }
}

export function form_data_get(fd, name) {
  const val = fd.get(name);
  if (val === null || val === undefined) return undefined;
  return to_form_field(val);
}

export function form_data_get_all(fd, name) {
  const vals = fd.getAll(name);
  return List.fromArray(vals.map(to_form_field));
}

export function form_data_entries(fd) {
  return entries_to_list(fd.entries());
}