defmodule NDCEx.Message.Base do import XmlBuilder require Logger @acceptable_ndc_methods [ AirShopping: ["AirShoppingRQ", "AirShoppingRS"], FlightPrice: ["FlightPriceRQ", "FlightPriceRS"], SeatAvailability: ["SeatAvailabilityRQ", "SeatAvailabilityRS"], ServiceList: ["ServiceListRQ", "ServiceListRS"], ServicePrice: ["ServicePriceRQ", "ServicePriceRS"], OrderCreate: ["OrderCreateRQ", "OrderViewRS"], OrderList: ["OrderListRQ", "OrderListRS"], OrderRetrieve: ["OrderRetrieveRQ", "OrderViewRS"], OrderCancel: ["OrderCancelRQ", "OrderCancelRS"] ] @node_names [ AirShopping: :CoreQuery, FlightPrice: [:Query, :DataLists, :Metadata], SeatAvailability: [:Query, :DataLists] ] def build_document(method, params) do [request_name, response_name] = get_request_data(method) build_body(request_name, params) |> doc end defp get_request_data(method), do: @acceptable_ndc_methods[method] defp document_attributes(request_name) do %{ "xmlns" => "http://www.iata.org/IATA/EDIST", "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation" => "http://www.iata.org/IATA/EDIST ../#{request_name}.xsd", "Version" => "15.2" } end defp build_body(request_name, params) do element(String.to_atom(request_name), document_attributes(request_name), [ element(Document: params[:Document]), element(Party: params[:Party]), element(Parameters: params[:Parameters]), element(Travelers: [params[:Travelers]]), element(CoreQuery: [params[:CoreQuery]]), element(Preferences: params[:Preferences]) ] ) end #defp get_node_name(method), do: @node_names[method] #defp get_node(params, method), do: {get_node_name(method), params[get_node_name(method)]} #defp get_node_element(params, method), do: element( { get_node_name(method), get_node(params, method) } ) end