ahmadnassri/httpsnippet

View on GitHub
src/targets/ocaml/cohttp/client.ts

Summary

Maintainability
A
1 hr
Test Coverage
/**
 * @description
 * HTTP code snippet generator for OCaml using CoHTTP.
 *
 * @author
 * @SGrondin
 *
 * for any questions or issues regarding the generated code snippet, please open an issue mentioning the author.
 */

import { CodeBuilder } from '../../../helpers/code-builder';
import { escapeForDoubleQuotes } from '../../../helpers/escape';
import { Client } from '../../targets';

export const cohttp: Client = {
  info: {
    key: 'cohttp',
    title: 'CoHTTP',
    link: 'https://github.com/mirage/ocaml-cohttp',
    description: 'Cohttp is a very lightweight HTTP server using Lwt or Async for OCaml',
  },
  convert: ({ fullUrl, allHeaders, postData, method }, options) => {
    const opts = {
      indent: '  ',
      ...options,
    };

    const methods = ['get', 'post', 'head', 'delete', 'patch', 'put', 'options'];
    const { push, blank, join } = new CodeBuilder({ indent: opts.indent });

    push('open Cohttp_lwt_unix');
    push('open Cohttp');
    push('open Lwt');
    blank();
    push(`let uri = Uri.of_string "${fullUrl}" in`);

    // Add headers, including the cookies
    const headers = Object.keys(allHeaders);

    if (headers.length === 1) {
      push(
        `let headers = Header.add (Header.init ()) "${headers[0]}" "${escapeForDoubleQuotes(allHeaders[headers[0]])}" in`,
      );
    } else if (headers.length > 1) {
      push('let headers = Header.add_list (Header.init ()) [');
      headers.forEach(key => {
        push(`("${key}", "${escapeForDoubleQuotes(allHeaders[key])}");`, 1);
      });
      push('] in');
    }

    // Add body
    if (postData.text) {
      // Just text
      push(`let body = Cohttp_lwt_body.of_string ${JSON.stringify(postData.text)} in`);
    }

    // Do the request
    blank();

    const h = headers.length ? '~headers ' : '';
    const b = postData.text ? '~body ' : '';
    const m = methods.includes(method.toLowerCase())
      ? `\`${method.toUpperCase()}`
      : `(Code.method_of_string "${method}")`;

    push(`Client.call ${h}${b}${m} uri`);

    // Catch result
    push('>>= fun (res, body_stream) ->');
    push('(* Do stuff with the result *)', 1);

    return join();
  },
};