Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.util.stream.Collectors;

import static org.apache.commons.lang3.StringUtils.capitalize;
import static org.openapitools.codegen.utils.StringUtils.escape;
import static org.openapitools.codegen.utils.StringUtils.underscore;

public class OCamlClientCodegen extends DefaultCodegen implements CodegenConfig {
Expand Down Expand Up @@ -631,9 +632,19 @@ private List<Map<String, Object>> buildEnumValues(String valueString) {
return result;
}

public String toEnumValueName(String name) {
if (reservedWords.contains(name)) {
return escapeReservedWord(name);
} else if (((CharSequence) name).chars().anyMatch(character -> specialCharReplacements.keySet().contains("" + ((char) character)))) {
return escape(name, specialCharReplacements, Collections.singletonList("_"), null);
} else {
return name;
}
}

private String ocamlizeEnumValue(String value) {
String sanitizedValue =
super.toVarName(value.isEmpty() ? "empty" : value)
toEnumValueName(value.isEmpty() ? "empty" : value)
.replace(" ", "_");

if (!sanitizedValue.matches("^[a-zA-Z_].*")) {
Expand Down Expand Up @@ -735,6 +746,9 @@ public String toEnumName(CodegenProperty property) {
@Override
public String toDefaultValue(Schema p) {
if (p.getDefault() != null) {
if (p.getEnum() != null) {
return ocamlizeEnumValue(p.getDefault().toString());
}
return p.getDefault().toString();
} else {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,58 @@

{{#operations}}
{{#operation}}
let {{{operationId}}} {{^hasParams}}(){{/hasParams}}{{#allParams}}{{{paramName}}}{{#hasMore}} {{/hasMore}}{{/allParams}} =
let {{{operationId}}} {{^hasParams}}(){{/hasParams}}{{#allParams}}{{> to_param}}{{#hasMore}} {{/hasMore}}{{#-last}}{{^required}} (){{/required}}{{/-last}}{{/allParams}} =
let open Lwt in
let uri = Request.build_uri "{{{path}}}" in
let headers = Request.default_headers in{{#headerParams}}
let headers = Cohttp.Header.add{{#isContainer}}_multi{{/isContainer}} headers "{{baseName}}" ({{> to_string}}{{paramName}}) in{{/headerParams}}{{#pathParams}}
let uri = Request.replace_path_param uri "{{{baseName}}}" ({{> to_string}}{{{paramName}}}) in{{/pathParams}}{{#queryParams}}
let uri = Uri.add_query_param{{^isListContainer}}'{{/isListContainer}} uri ("{{{baseName}}}", {{> to_string}}{{{paramName}}}) in{{/queryParams}}{{#hasAuthMethods}}{{#authMethods}}{{#isApiKey}}{{#isKeyInQuery}}
let uri = Uri.add_query_param' uri ("{{{keyParamName}}}", Request.api_key) in{{/isKeyInQuery}}{{/isApiKey}}{{/authMethods}}{{/hasAuthMethods}}{{#bodyParams}}
let body = Request.{{#isFreeFormObject}}write_json_body{{/isFreeFormObject}}{{#isByteArray}}write_string_body{{/isByteArray}}{{^isFreeFormObject}}{{^isByteArray}}write_as_json_body{{/isByteArray}}{{/isFreeFormObject}} {{> to_json}} {{{paramName}}} in{{/bodyParams}}{{^hasBodyParam}}{{#hasFormParams}}
let body = Request.init_form_encoded_body () in{{/hasFormParams}}{{#formParams}}
let body = Request.add_form_encoded_body_param{{#isContainer}}s{{/isContainer}} body ("{{{paramName}}}", {{> to_string}}{{{paramName}}}) in{{/formParams}}{{#hasFormParams}}
let body = Request.finalize_form_encoded_body body in{{/hasFormParams}}{{/hasBodyParam}}
Cohttp_lwt_unix.Client.call `{{{httpMethod}}} uri ~headers {{#hasBodyParam}}~body {{/hasBodyParam}}{{^hasBodyParam}}{{#hasFormParams}}~body {{/hasFormParams}}{{/hasBodyParam}}>>= fun (resp, body) ->{{^returnType}}
Request.handle_unit_response resp{{/returnType}}{{#returnType}}
Request.read_json_body{{#returnContainer}}{{#isListContainer}}_as_list{{/isListContainer}}{{#isMapContainer}}_as_map{{/isMapContainer}}{{#returnBaseType}}{{^vendorExtensions.x-returnFreeFormObject}}_of{{/vendorExtensions.x-returnFreeFormObject}}{{/returnBaseType}}{{/returnContainer}}{{^returnContainer}}{{#returnBaseType}}{{^vendorExtensions.x-returnFreeFormObject}}_as{{/vendorExtensions.x-returnFreeFormObject}}{{/returnBaseType}}{{/returnContainer}} {{#returnType}}{{^vendorExtensions.x-returnFreeFormObject}}({{> of_json}}){{/vendorExtensions.x-returnFreeFormObject}}{{/returnType}} resp body{{/returnType}}
let headers = Request.default_headers in
{{#hasAuthMethods}}
{{#authMethods}}
{{#isApiKey}}
{{#isKeyInHeader}}
let headers = Cohttp.Header.add headers "{{{keyParamName}}}" Request.api_key in
{{/isKeyInHeader}}
{{/isApiKey}}
{{/authMethods}}
{{/hasAuthMethods}}
{{#headerParams}}
let headers = Request.{{> to_optional_prefix}}add_header{{#isContainer}}_multi{{/isContainer}} headers "{{baseName}}" {{> to_string}} {{{paramName}}} in
{{/headerParams}}
{{#pathParams}}
let uri = Request.{{> to_optional_prefix}}replace_path_param uri "{{{baseName}}}" {{> to_string}} {{{paramName}}} in
{{/pathParams}}
{{#queryParams}}
let uri = Request.{{> to_optional_prefix}}add_query_param{{#isListContainer}}_list{{/isListContainer}} uri "{{{baseName}}}" {{> to_string}} {{{paramName}}} in
{{/queryParams}}
{{#hasAuthMethods}}
{{#authMethods}}
{{#isApiKey}}
{{#isKeyInQuery}}
let uri = Uri.add_query_param' uri ("{{{keyParamName}}}", Request.api_key) in
{{/isKeyInQuery}}
{{/isApiKey}}
{{/authMethods}}
{{/hasAuthMethods}}
{{#bodyParams}}
let body = Request.{{#isFreeFormObject}}write_json_body{{/isFreeFormObject}}{{#isByteArray}}write_string_body{{/isByteArray}}{{^isFreeFormObject}}{{^isByteArray}}write_as_json_body{{/isByteArray}}{{/isFreeFormObject}} {{> to_json}} {{{paramName}}} in
{{/bodyParams}}
{{^hasBodyParam}}
{{#hasFormParams}}
let body = Request.init_form_encoded_body () in
{{/hasFormParams}}
{{#formParams}}
let body = Request.{{> to_optional_prefix}}add_form_encoded_body_param{{#isContainer}}_list{{/isContainer}} body "{{{paramName}}}" {{> to_string}} {{{paramName}}} in
{{/formParams}}
{{#hasFormParams}}
let body = Request.finalize_form_encoded_body body in
{{/hasFormParams}}
{{/hasBodyParam}}
Cohttp_lwt_unix.Client.call `{{{httpMethod}}} uri ~headers {{#hasBodyParam}}~body {{/hasBodyParam}}{{^hasBodyParam}}{{#hasFormParams}}~body {{/hasFormParams}}{{/hasBodyParam}}>>= fun (resp, body) ->
{{^returnType}}
Request.handle_unit_response resp
{{/returnType}}
{{#returnType}}
Request.read_json_body{{#returnContainer}}{{#isListContainer}}_as_list{{/isListContainer}}{{#isMapContainer}}_as_map{{/isMapContainer}}{{#returnBaseType}}{{^vendorExtensions.x-returnFreeFormObject}}_of{{/vendorExtensions.x-returnFreeFormObject}}{{/returnBaseType}}{{/returnContainer}}{{^returnContainer}}{{#returnBaseType}}{{^vendorExtensions.x-returnFreeFormObject}}_as{{/vendorExtensions.x-returnFreeFormObject}}{{/returnBaseType}}{{/returnContainer}} {{#returnType}}{{^vendorExtensions.x-returnFreeFormObject}}({{> of_json}}){{/vendorExtensions.x-returnFreeFormObject}}{{/returnType}} resp body
{{/returnType}}

{{/operation}}
{{/operations}}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@

{{#operations}}
{{#operation}}
val {{{operationId}}} : {{^hasParams}}unit{{/hasParams}}{{#allParams}}{{#isEnum}}Enums.{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#hasMore}} -> {{/hasMore}}{{/allParams}} -> {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}unit{{/returnType}} Lwt.t
val {{{operationId}}} : {{^hasParams}}unit{{/hasParams}}{{#allParams}}{{#required}}{{{paramName}}}{{/required}}{{^required}}{{^isBodyParam}}?{{/isBodyParam}}{{{paramName}}}{{/required}}:{{#isEnum}}Enums.{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#hasMore}} -> {{/hasMore}}{{#-last}}{{^required}} -> unit{{/required}}{{/-last}}{{/allParams}} -> {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}unit{{/returnType}} Lwt.t
{{/operation}}
{{/operations}}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ type t = {
(* {{{description}}} *)
{{/description}}
{{#isEnum}}
{{{name}}}: {{^isMapContainer}}Enums.{{/isMapContainer}}{{{datatypeWithEnum}}}{{^isContainer}}{{#defaultValue}}[@default {{{defaultValue}}}]{{/defaultValue}}{{/isContainer}}{{^isContainer}}{{#required}}{{#isNullable}} option [@default None]{{/isNullable}}{{/required}}{{/isContainer}}{{^isContainer}}{{^required}} option [@default None]{{/required}}{{/isContainer}};
{{{name}}}: {{^isMapContainer}}Enums.{{/isMapContainer}}{{{datatypeWithEnum}}}{{^isContainer}}{{#required}}{{#defaultValue}}[@default {{{defaultValue}}}]{{/defaultValue}}{{/required}}{{/isContainer}}{{^isContainer}}{{#required}}{{#isNullable}} option [@default {{#defaultValue}}Some({{{defaultValue}}}){{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}]{{/isNullable}}{{/required}}{{/isContainer}}{{^isContainer}}{{^required}} option [@default {{#defaultValue}}Some({{{defaultValue}}}){{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}]{{/required}}{{/isContainer}};
{{/isEnum}}
{{^isEnum}}
{{{name}}}: {{{datatypeWithEnum}}}{{^isContainer}}{{#required}}{{#isNullable}} option{{/isNullable}}{{/required}}{{/isContainer}}{{^isContainer}}{{^required}} option [@default None]{{/required}}{{/isContainer}};
{{/isEnum}}
{{/vars}}
} [@@deriving yojson, show ];;
} [@@deriving yojson { strict = false }, show ];;

{{#description}}
(** {{{description}}} *)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,31 @@ let api_key = ""
let base_url = "{{{basePath}}}"
let default_headers = Cohttp.Header.init_with "Content-Type" "application/json"

let option_fold f default o =
match o with
| Some v -> f v
| None -> default

let build_uri operation_path = Uri.of_string (base_url ^ operation_path)

let add_string_header headers key value =
Cohttp.Header.add headers key value

let add_string_header_multi headers key values =
Cohttp.Header.add_multi headers key values

let add_header headers key to_string value =
Cohttp.Header.add headers key (to_string value)

let add_header_multi headers key to_string value =
Cohttp.Header.add_multi headers key (to_string value)

let maybe_add_header headers key to_string value =
option_fold (add_header headers key to_string) headers value

let maybe_add_header_multi headers key to_string value =
option_fold (add_header_multi headers key to_string) headers value

let write_string_body s = Cohttp_lwt.Body.of_string s

let write_json_body payload =
Expand Down Expand Up @@ -37,20 +60,38 @@ let read_json_body_as_map resp body =
let read_json_body_as_map_of of_json resp body =
Lwt.(read_json_body_as_map resp body >|= List.map (fun (s, v) -> (s, of_json v)))

let replace_path_param uri param_name param_value =
let replace_string_path_param uri param_name param_value =
let regexp = Str.regexp (Str.quote ("{" ^ param_name ^ "}")) in
let path = Str.global_replace regexp param_value (Uri.path uri) in
let path = Str.global_replace regexp param_value (Uri.pct_decode (Uri.path uri)) in
Uri.with_path uri path

let replace_path_param uri param_name to_string param_value =
replace_string_path_param uri param_name (to_string param_value)

let maybe_replace_path_param uri param_name to_string param_value =
option_fold (replace_path_param uri param_name to_string) uri param_value

let add_query_param uri param_name to_string param_value =
Uri.add_query_param' uri (param_name, to_string param_value)

let add_query_param_list uri param_name to_string param_value =
Uri.add_query_param uri (param_name, to_string param_value)

let maybe_add_query_param uri param_name to_string param_value =
option_fold (add_query_param uri param_name to_string) uri param_value

let init_form_encoded_body () = ""

let add_form_encoded_body_param params (paramName, paramValue) =
let new_param_enc = Printf.sprintf {|%s=%s|} (Uri.pct_encode paramName) (Uri.pct_encode paramValue) in
let add_form_encoded_body_param params param_name to_string param_value =
let new_param_enc = Printf.sprintf {|%s=%s|} (Uri.pct_encode param_name) (Uri.pct_encode (to_string param_value)) in
if params = ""
then new_param_enc
else Printf.sprintf {|%s&%s|} params new_param_enc

let add_form_encoded_body_params params (paramName, new_params) =
add_form_encoded_body_param params (paramName, String.concat "," new_params)
let add_form_encoded_body_param_list params param_name to_string new_params =
add_form_encoded_body_param params param_name (String.concat ",") (to_string new_params)

let maybe_add_form_encoded_body_param params param_name to_string param_value =
option_fold (add_form_encoded_body_param params param_name to_string) params param_value

let finalize_form_encoded_body body = Cohttp_lwt.Body.of_string body
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{^required}}{{^defaultValue}}{{^isContainer}}maybe_{{/isContainer}}{{/defaultValue}}{{/required}}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{^isBodyParam}}{{^required}}?{{#defaultValue}}({{{paramName}}} = {{^isEnum}}{{#isString}}"{{{defaultValue}}}"{{/isString}}{{#isBoolean}}{{{defaultValue}}}{{/isBoolean}}{{#isShort}}{{{defaultValue}}}{{/isShort}}{{#isInteger}}{{{defaultValue}}}l{{/isInteger}}{{#isLong}}{{{defaultValue}}}L{{/isLong}}{{#isFloat}}{{{defaultValue}}}.{{/isFloat}}{{#isNumber}}{{{defaultValue}}}.{{/isNumber}}{{/isEnum}}{{#isEnum}}{{#isContainer}}[{{{defaultValue}}}]{{/isContainer}}{{^isContainer}}{{{defaultValue}}}{{/isContainer}}{{/isEnum}}){{/defaultValue}}{{^defaultValue}}{{^isContainer}}{{{paramName}}}{{/isContainer}}{{#isContainer}}({{{paramName}}} = []){{/isContainer}}{{/defaultValue}}{{/required}}{{#required}}~{{{paramName}}}{{/required}}{{/isBodyParam}}{{#isBodyParam}}~{{{paramName}}}{{/isBodyParam}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#isContainer}}{{#items}}{{#isEnum}}List.map {{> to_string}}{{/isEnum}}{{#isModel}}List.map {{> to_string}}{{/isModel}}{{/items}}{{/isContainer}}{{^isEnum}}{{#isString}}{{/isString}}{{#isLong}}Int64.to_string {{/isLong}}{{#isInteger}}Int32.to_string {{/isInteger}}{{#isFloat}}string_of_float {{/isFloat}}{{#isNumber}}string_of_float {{/isNumber}}{{#isDouble}}string_of_float {{/isDouble}}{{#isBoolean}}string_of_bool {{/isBoolean}}{{#isByteArray}}{{/isByteArray}}{{#isModel}}{{{vendorExtensions.x-modelModule}}}.show {{/isModel}}{{/isEnum}}{{^isModel}}{{^isContainer}}{{#isEnum}}Enums.show_{{{datatypeWithEnum}}} {{/isEnum}}{{/isContainer}}{{/isModel}}
{{#isContainer}}{{#items}}(List.map {{> to_string}}){{/items}}{{/isContainer}}{{^isEnum}}{{#isLong}}Int64.to_string{{/isLong}}{{#isInteger}}Int32.to_string{{/isInteger}}{{#isFloat}}string_of_float{{/isFloat}}{{#isNumber}}string_of_float{{/isNumber}}{{#isDouble}}string_of_float{{/isDouble}}{{#isBoolean}}string_of_bool{{/isBoolean}}{{#isFile}}(fun x -> x){{/isFile}}{{#isDate}}(fun x -> x){{/isDate}}{{#isDateTime}}(fun x -> x){{/isDateTime}}{{#isString}}(fun x -> x){{/isString}}{{#isByteArray}}(fun x -> x){{/isByteArray}}{{#isModel}}{{{vendorExtensions.x-modelModule}}}.show{{/isModel}}{{/isEnum}}{{^isModel}}{{^isContainer}}{{#isEnum}}Enums.show_{{{datatypeWithEnum}}}{{/isEnum}}{{/isContainer}}{{/isModel}}
39 changes: 20 additions & 19 deletions samples/client/petstore/ocaml/src/apis/pet_api.ml
Original file line number Diff line number Diff line change
Expand Up @@ -5,75 +5,76 @@
*
*)

let add_pet body =
let add_pet ~body =
let open Lwt in
let uri = Request.build_uri "/pet" in
let headers = Request.default_headers in
let body = Request.write_as_json_body Pet.to_yojson body in
Cohttp_lwt_unix.Client.call `POST uri ~headers ~body >>= fun (resp, body) ->
Request.handle_unit_response resp

let delete_pet pet_id api_key =
let delete_pet ~pet_id ?api_key () =
let open Lwt in
let uri = Request.build_uri "/pet/{petId}" in
let headers = Request.default_headers in
let headers = Cohttp.Header.add headers "api_key" (api_key) in
let uri = Request.replace_path_param uri "petId" (Int64.to_string pet_id) in
let headers = Request.maybe_add_header headers "api_key" (fun x -> x) api_key in
let uri = Request.replace_path_param uri "petId" Int64.to_string pet_id in
Cohttp_lwt_unix.Client.call `DELETE uri ~headers >>= fun (resp, body) ->
Request.handle_unit_response resp

let find_pets_by_status status =
let find_pets_by_status ~status =
let open Lwt in
let uri = Request.build_uri "/pet/findByStatus" in
let headers = Request.default_headers in
let uri = Uri.add_query_param uri ("status", List.map Enums.show_pet_status status) in
let uri = Request.add_query_param_list uri "status" (List.map Enums.show_pet_status) status in
Cohttp_lwt_unix.Client.call `GET uri ~headers >>= fun (resp, body) ->
Request.read_json_body_as_list_of (JsonSupport.unwrap Pet.of_yojson) resp body

let find_pets_by_tags tags =
let find_pets_by_tags ~tags =
let open Lwt in
let uri = Request.build_uri "/pet/findByTags" in
let headers = Request.default_headers in
let uri = Uri.add_query_param uri ("tags", tags) in
let uri = Request.add_query_param_list uri "tags" (List.map (fun x -> x)) tags in
Cohttp_lwt_unix.Client.call `GET uri ~headers >>= fun (resp, body) ->
Request.read_json_body_as_list_of (JsonSupport.unwrap Pet.of_yojson) resp body

let get_pet_by_id pet_id =
let get_pet_by_id ~pet_id =
let open Lwt in
let uri = Request.build_uri "/pet/{petId}" in
let headers = Request.default_headers in
let uri = Request.replace_path_param uri "petId" (Int64.to_string pet_id) in
let headers = Cohttp.Header.add headers "api_key" Request.api_key in
let uri = Request.replace_path_param uri "petId" Int64.to_string pet_id in
Cohttp_lwt_unix.Client.call `GET uri ~headers >>= fun (resp, body) ->
Request.read_json_body_as (JsonSupport.unwrap Pet.of_yojson) resp body

let update_pet body =
let update_pet ~body =
let open Lwt in
let uri = Request.build_uri "/pet" in
let headers = Request.default_headers in
let body = Request.write_as_json_body Pet.to_yojson body in
Cohttp_lwt_unix.Client.call `PUT uri ~headers ~body >>= fun (resp, body) ->
Request.handle_unit_response resp

let update_pet_with_form pet_id name status =
let update_pet_with_form ~pet_id ?name ?status () =
let open Lwt in
let uri = Request.build_uri "/pet/{petId}" in
let headers = Request.default_headers in
let uri = Request.replace_path_param uri "petId" (Int64.to_string pet_id) in
let uri = Request.replace_path_param uri "petId" Int64.to_string pet_id in
let body = Request.init_form_encoded_body () in
let body = Request.add_form_encoded_body_param body ("name", name) in
let body = Request.add_form_encoded_body_param body ("status", status) in
let body = Request.maybe_add_form_encoded_body_param body "name" (fun x -> x) name in
let body = Request.maybe_add_form_encoded_body_param body "status" (fun x -> x) status in
let body = Request.finalize_form_encoded_body body in
Cohttp_lwt_unix.Client.call `POST uri ~headers ~body >>= fun (resp, body) ->
Request.handle_unit_response resp

let upload_file pet_id additional_metadata file =
let upload_file ~pet_id ?additional_metadata ?file () =
let open Lwt in
let uri = Request.build_uri "/pet/{petId}/uploadImage" in
let headers = Request.default_headers in
let uri = Request.replace_path_param uri "petId" (Int64.to_string pet_id) in
let uri = Request.replace_path_param uri "petId" Int64.to_string pet_id in
let body = Request.init_form_encoded_body () in
let body = Request.add_form_encoded_body_param body ("additional_metadata", additional_metadata) in
let body = Request.add_form_encoded_body_param body ("file", file) in
let body = Request.maybe_add_form_encoded_body_param body "additional_metadata" (fun x -> x) additional_metadata in
let body = Request.maybe_add_form_encoded_body_param body "file" (fun x -> x) file in
let body = Request.finalize_form_encoded_body body in
Cohttp_lwt_unix.Client.call `POST uri ~headers ~body >>= fun (resp, body) ->
Request.read_json_body_as (JsonSupport.unwrap Api_response.of_yojson) resp body
Expand Down
Loading