Current section
Files
Jump to
Current section
Files
src/xmerl_xpath_macros.hrl
%% esaml - SAML for erlang
%%
%% Copyright (c) 2013, Alex Wilson and the University of Queensland
%% All rights reserved.
%%
%% Distributed subject to the terms of the 2-clause BSD license, see
%% the LICENSE file in the root of the distribution.
-define(xpath_generic(XPath, Record, Field, TransFun, TargetType, NotFoundRet),
fun(Resp) ->
case xmerl_xpath:string(XPath, Xml, [{namespace, Ns}]) of
[#TargetType{value = V}] -> Resp#Record{Field = TransFun(V)};
_ -> NotFoundRet
end
end).
-define(xpath_generic(XPath, Record, Field, TargetType, NotFoundRet),
fun(Resp) ->
case xmerl_xpath:string(XPath, Xml, [{namespace, Ns}]) of
[#TargetType{value = V}] -> Resp#Record{Field = V};
_ -> NotFoundRet
end
end).
-define(xpath_attr(XPath, Record, Field),
?xpath_generic(XPath, Record, Field, xmlAttribute, Resp)).
-define(xpath_attr(XPath, Record, Field, TransFun),
?xpath_generic(XPath, Record, Field, TransFun, xmlAttribute, Resp)).
-define(xpath_attr_required(XPath, Record, Field, Error),
?xpath_generic(XPath, Record, Field, xmlAttribute, {error, Error})).
-define(xpath_attr_required(XPath, Record, Field, TransFun, Error),
?xpath_generic(XPath, Record, Field, TransFun, xmlAttribute, {error, Error})).
-define(xpath_text(XPath, Record, Field),
?xpath_generic(XPath, Record, Field, xmlText, Resp)).
-define(xpath_text(XPath, Record, Field, TransFun),
?xpath_generic(XPath, Record, Field, TransFun, xmlText, Resp)).
-define(xpath_text_required(XPath, Record, Field, Error),
?xpath_generic(XPath, Record, Field, xmlText, {error, Error})).
-define(xpath_text_required(XPath, Record, Field, TransFun, Error),
?xpath_generic(XPath, Record, Field, TransFun, xmlText, {error, Error})).
-define(xpath_text_append(XPath, Record, Field, Sep),
fun(Resp) ->
case xmerl_xpath:string(XPath, Xml, [{namespace, Ns}]) of
[#xmlText{value = V}] -> Resp#Record{Field = Resp#Record.Field ++ Sep ++ V};
_ -> Resp
end
end).
-define(xpath_recurse(XPath, Record, Field, F),
fun(Resp) ->
case xmerl_xpath:string(XPath, Xml, [{namespace, Ns}]) of
[E = #xmlElement{}] ->
case F(E) of
{error, V} -> {error, V};
{ok, V} -> Resp#Record{Field = V}
end;
_ -> Resp
end
end).