aboutsummaryrefslogtreecommitdiff
path: root/src/pubsub_publish_options.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/pubsub_publish_options.erl')
-rw-r--r--src/pubsub_publish_options.erl157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/pubsub_publish_options.erl b/src/pubsub_publish_options.erl
new file mode 100644
index 000000000..8d0229071
--- /dev/null
+++ b/src/pubsub_publish_options.erl
@@ -0,0 +1,157 @@
+%% Created automatically by xdata generator (xdata_codec.erl)
+%% Source: pubsub_publish_options.xdata
+%% Form type: http://jabber.org/protocol/pubsub#publish-options
+%% Document: XEP-0060
+
+-module(pubsub_publish_options).
+
+-export([decode/1, decode/2, encode/1, encode/2,
+ format_error/1]).
+
+-include("xmpp_codec.hrl").
+
+-include("pubsub_publish_options.hrl").
+
+-export_type([{property, 0}, {result, 0}, {form, 0}]).
+
+dec_enum(Val, Enums) ->
+ AtomVal = erlang:binary_to_existing_atom(Val, utf8),
+ case lists:member(AtomVal, Enums) of
+ true -> AtomVal
+ end.
+
+enc_enum(Atom) -> erlang:atom_to_binary(Atom, utf8).
+
+format_error({form_type_mismatch, Type}) ->
+ <<"FORM_TYPE doesn't match '", Type/binary, "'">>;
+format_error({bad_var_value, Var, Type}) ->
+ <<"Bad value of field '", Var/binary, "' of type '",
+ Type/binary, "'">>;
+format_error({missing_value, Var, Type}) ->
+ <<"Missing value of field '", Var/binary, "' of type '",
+ Type/binary, "'">>;
+format_error({too_many_values, Var, Type}) ->
+ <<"Too many values for field '", Var/binary,
+ "' of type '", Type/binary, "'">>;
+format_error({unknown_var, Var, Type}) ->
+ <<"Unknown field '", Var/binary, "' of type '",
+ Type/binary, "'">>;
+format_error({missing_required_var, Var, Type}) ->
+ <<"Missing required field '", Var/binary, "' of type '",
+ Type/binary, "'">>.
+
+decode(Fs) -> decode(Fs, []).
+
+decode(Fs, Acc) ->
+ case lists:keyfind(<<"FORM_TYPE">>, #xdata_field.var,
+ Fs)
+ of
+ false -> decode(Fs, Acc, []);
+ #xdata_field{values =
+ [<<"http://jabber.org/protocol/pubsub#publish-opt"
+ "ions">>]} ->
+ decode(Fs, Acc, []);
+ _ ->
+ erlang:error({?MODULE,
+ {form_type_mismatch,
+ <<"http://jabber.org/protocol/pubsub#publish-opt"
+ "ions">>}})
+ end.
+
+encode(Cfg) -> encode(Cfg, fun (Text) -> Text end).
+
+encode(List, Translate) when is_list(List) ->
+ Fs = [case Opt of
+ {access_model, Val} ->
+ [encode_access_model(Val, default, Translate)];
+ {access_model, Val, Opts} ->
+ [encode_access_model(Val, Opts, Translate)];
+ #xdata_field{} -> [Opt];
+ _ -> []
+ end
+ || Opt <- List],
+ FormType = #xdata_field{var = <<"FORM_TYPE">>,
+ type = hidden,
+ values =
+ [<<"http://jabber.org/protocol/pubsub#publish-opt"
+ "ions">>]},
+ [FormType | lists:flatten(Fs)].
+
+decode([#xdata_field{var = <<"pubsub#access_model">>,
+ values = [Value]}
+ | Fs],
+ Acc, Required) ->
+ try dec_enum(Value,
+ [authorize, open, presence, roster, whitelist])
+ of
+ Result ->
+ decode(Fs, [{access_model, Result} | Acc],
+ lists:delete(<<"pubsub#access_model">>, Required))
+ catch
+ _:_ ->
+ erlang:error({?MODULE,
+ {bad_var_value, <<"pubsub#access_model">>,
+ <<"http://jabber.org/protocol/pubsub#publish-opt"
+ "ions">>}})
+ end;
+decode([#xdata_field{var = <<"pubsub#access_model">>,
+ values = []} =
+ F
+ | Fs],
+ Acc, Required) ->
+ decode([F#xdata_field{var = <<"pubsub#access_model">>,
+ values = [<<>>]}
+ | Fs],
+ Acc, Required);
+decode([#xdata_field{var = <<"pubsub#access_model">>}
+ | _],
+ _, _) ->
+ erlang:error({?MODULE,
+ {too_many_values, <<"pubsub#access_model">>,
+ <<"http://jabber.org/protocol/pubsub#publish-opt"
+ "ions">>}});
+decode([#xdata_field{var = Var} | Fs], Acc, Required) ->
+ if Var /= <<"FORM_TYPE">> ->
+ erlang:error({?MODULE,
+ {unknown_var, Var,
+ <<"http://jabber.org/protocol/pubsub#publish-opt"
+ "ions">>}});
+ true -> decode(Fs, Acc, Required)
+ end;
+decode([], _, [Var | _]) ->
+ erlang:error({?MODULE,
+ {missing_required_var, Var,
+ <<"http://jabber.org/protocol/pubsub#publish-opt"
+ "ions">>}});
+decode([], Acc, []) -> Acc.
+
+encode_access_model(Value, Options, Translate) ->
+ Values = case Value of
+ undefined -> [];
+ Value -> [enc_enum(Value)]
+ end,
+ Opts = if Options == default ->
+ [#xdata_option{label =
+ Translate(<<"Access model of authorize">>),
+ value = <<"authorize">>},
+ #xdata_option{label =
+ Translate(<<"Access model of open">>),
+ value = <<"open">>},
+ #xdata_option{label =
+ Translate(<<"Access model of presence">>),
+ value = <<"presence">>},
+ #xdata_option{label =
+ Translate(<<"Access model of roster">>),
+ value = <<"roster">>},
+ #xdata_option{label =
+ Translate(<<"Access model of whitelist">>),
+ value = <<"whitelist">>}];
+ true ->
+ [#xdata_option{label = Translate(L),
+ value = enc_enum(V)}
+ || {L, V} <- Options]
+ end,
+ #xdata_field{var = <<"pubsub#access_model">>,
+ values = Values, required = false, type = 'list-single',
+ options = Opts, desc = <<>>,
+ label = Translate(<<"Specify the access model">>)}.