#!/usr/bin/env swipl % -*- mode: prolog -*- :- use_module(library(main)). :- use_module(library(apply)). :- use_module(library(lists)). :- use_module(library(option)). :- use_module(library(openapi)). :- initialization(main, main). main(Argv) :- argv_options(Argv, Files, Options), ( option(client(_), Options) ; option(server(_), Options) ), !, setup_debug(Options), maplist(generate(Options), Files). main(_) :- usage, halt. generate(Options, File) :- gen_client(File, Options), gen_server(File, Options). gen_client(File, Options) :- option(client(Client), Options), !, output_options(client(Client), File, Out), append(Options, Out, GenOptions), openapi_doc(File, client, GenOptions). gen_client(_, _). gen_server(File, Options) :- option(server(Server), Options), !, output_options(server(Server), File, Out), append(Options, Out, GenOptions), openapi_doc(File, server, GenOptions). gen_server(_, _). output_options(client(-), _, []) :- !. output_options(server(-), _, []) :- !. output_options(client(true), From, [file(Out)]) :- !, file_name_extension(Base, _, From), atomic_list_concat([Base, '_client.pl'], Out). output_options(server(true), From, [file(Out)]) :- !, file_name_extension(Base, _, From), atomic_list_concat([Base, '_server.pl'], Out). output_options(client(File), _, [file(File)]). output_options(server(File), _, [file(File)]). setup_debug(Options) :- forall(member(spy(Spy), Options), ( term_string(Term, Spy), gspy(Term) )), ( option(gtrace(true), Options) -> gtrace ; true ), ( option(debug(true), Options) -> debug ; true ). usage :- current_prolog_flag(os_argv, [_,Exe|_]), format(user_error, 'Usage: ~w [options] file ...~n', [Exe]), format(user_error, ' --client[=file] Generate client --no-type-check-results Do not type check results --module[=name] Generate a module (client only) --server[=file] Generate server --ui Include Swagger UI (implies --httpd) --httpd Include REST HTTP server ', []).