1:- module(omdb_query, [
    2	retrieval_query/2,
    3	search_query/2
    4]).    5
    6:- use_module(library(lists), [member/2, union/3]).    7:- use_module(library(apply), [maplist/2, maplist/3]).    8:- use_module(library(error), [must_be/2]).    9:- use_module(library(uri), [uri_encoded/3]).   10:- use_module(library(dcg/basics)).   11:- use_module(library(typedef)).   12
   13
   14/** <module> OMDB URL query construction
   15This module is responsible for taking user supplied API parameters and
   16constructing the URL responsible for the actual requests to the server.
   17
   18@author Ebrahim Azarisooreh
   19@license MIT
   20*/
   21
   22
   23:- type retrieval_option --->
   24	id
   25	;title
   26	;media_type
   27	;year
   28	;plot
   29	;tomatoes
   30	;callback
   31	;version.
   32
   33:- type search_option --->
   34	title
   35	;media_type
   36	;year
   37	;page
   38	;callback
   39	;version.
   40
   41retrieval_option_set([
   42	id=_,
   43	title=_,
   44	media_type=_,
   45	year=_,
   46	plot=_,
   47	tomatoes=_,
   48	callback=_,
   49	version=_
   50]).
   51
   52search_option_set([
   53	title=_,
   54	media_type=_,
   55	year=_,
   56	page=_,
   57	callback=_,
   58	version=_
   59]).
   60
   61
   62%--------------------------------------------------------------------------------%
   63% Interface
   64%--------------------------------------------------------------------------------%
   65
   66
   67retrieval_query(Args, Template) :-
   68	pretreat_params(retrieval, Args, Treated),
   69	phrase(omdb_retrieval(Query), Treated),
   70	format(atom(Template), '~w&~w&~w&~w&~w&~w&~w&~w', Query).
   71
   72search_query(Args, Template) :-
   73	pretreat_params(search, Args, Treated),
   74	phrase(omdb_search(Query), Treated),
   75	format(atom(Template), '~w&~w&~w&~w&~w&~w', Query).
   76
   77pretreat_params(SetType, Params, Treated) :-
   78	option_set(SetType, Set, OptionType),
   79	union(Params, Set, Union),
   80	maplist(set_default(OptionType), Union),
   81	maplist(encode_atom, Union, Treated).
   82
   83set_default(OptionType, K=V) :-
   84	must_be(OptionType, K),
   85	ignore(V='').
   86
   87encode_atom(X=Y, X=E) :-
   88	uri_encoded(fragment, Y, E).
   89
   90option_set(retrieval, Set, retrieval_option) :-
   91	retrieval_option_set(Set).
   92
   93option_set(search, Set, search_option) :-
   94	search_option_set(Set).
   95
   96
   97%--------------------------------------------------------------------------------%
   98% Argument Construction (retrievals)
   99%--------------------------------------------------------------------------------%
  100
  101
  102omdb_retrieval([]) --> eos.
  103omdb_retrieval([i=Value|Rest]) -->
  104	[id=Value],
  105	omdb_retrieval(Rest).
  106
  107omdb_retrieval([t=Value|Rest]) -->
  108	[title=Value],
  109	omdb_retrieval(Rest).
  110
  111omdb_retrieval(['type'=Value|Rest]) -->
  112	[media_type=Value],
  113	omdb_retrieval(Rest).
  114
  115omdb_retrieval([y=Value|Rest]) -->
  116	[year=Value],
  117	omdb_retrieval(Rest).
  118
  119omdb_retrieval([plot=Value|Rest]) -->
  120	[plot=Value],
  121	omdb_retrieval(Rest).
  122
  123omdb_retrieval([tomatoes=Value|Rest]) -->
  124	[tomatoes=Value],
  125	omdb_retrieval(Rest).
  126
  127omdb_retrieval([callback=Value|Rest]) -->
  128	[callback=Value],
  129	omdb_retrieval(Rest).
  130
  131omdb_retrieval([v=Value|Rest]) -->
  132	[version=Value],
  133	omdb_retrieval(Rest).
  134
  135
  136%--------------------------------------------------------------------------------%
  137% Argument Construction (Searches)
  138%--------------------------------------------------------------------------------%
  139
  140
  141omdb_search([]) --> eos.
  142omdb_search([s=Value|Rest]) -->
  143	[title=Value],
  144	omdb_search(Rest).
  145
  146omdb_search(['type'=Value|Rest]) -->
  147	[media_type=Value],
  148	omdb_search(Rest).
  149
  150omdb_search([y=Value|Rest]) -->
  151	[year=Value],
  152	omdb_search(Rest).
  153
  154omdb_search([page=Value|Rest]) -->
  155	[page=Value],
  156	omdb_search(Rest).
  157
  158omdb_search([callback=Value|Rest]) -->
  159	[callback=Value],
  160	omdb_search(Rest).
  161
  162omdb_search([v=Value|Rest]) -->
  163	[version=Value],
  164	omdb_search(Rest)