%% Created automatically by xdata generator (xdata_codec.erl) %% Source: pubsub_node_config.xdata %% Form type: http://jabber.org/protocol/pubsub#node_config %% Document: XEP-0060 -module(pubsub_node_config). -export([decode/1, decode/2, encode/1, encode/2, format_error/1]). -include("xmpp_codec.hrl"). -include("pubsub_node_config.hrl"). -export_type([property/0, result/0, form/0]). dec_int(Val, Min, Max) -> case list_to_integer(binary_to_list(Val)) of Int when Int =< Max, Min == infinity -> Int; Int when Int =< Max, Int >= Min -> Int end. enc_int(Int) -> integer_to_binary(Int). 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). dec_bool(<<"1">>) -> true; dec_bool(<<"0">>) -> false; dec_bool(<<"true">>) -> true; dec_bool(<<"false">>) -> false. enc_bool(true) -> <<"1">>; enc_bool(false) -> <<"0">>. enc_jid(J) -> jid:to_string(J). dec_jid(Val) -> case jid:from_string(Val) of error -> erlang:error(badarg); J -> J end. 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#node_config">>]} -> decode(Fs, Acc, []); _ -> erlang:error({?MODULE, {form_type_mismatch, <<"http://jabber.org/protocol/pubsub#node_config">>}}) 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)]; {body_xslt, Val} -> [encode_body_xslt(Val, Translate)]; {body_xslt, _, _} -> erlang:error({badarg, Opt}); {children_association_policy, Val} -> [encode_children_association_policy(Val, default, Translate)]; {children_association_policy, Val, Opts} -> [encode_children_association_policy(Val, Opts, Translate)]; {children_association_whitelist, Val} -> [encode_children_association_whitelist(Val, Translate)]; {children_association_whitelist, _, _} -> erlang:error({badarg, Opt}); {children, Val} -> [encode_children(Val, Translate)]; {children, _, _} -> erlang:error({badarg, Opt}); {children_max, Val} -> [encode_children_max(Val, Translate)]; {children_max, _, _} -> erlang:error({badarg, Opt}); {collection, Val} -> [encode_collection(Val, Translate)]; {collection, _, _} -> erlang:error({badarg, Opt}); {contact, Val} -> [encode_contact(Val, Translate)]; {contact, _, _} -> erlang:error({badarg, Opt}); {dataform_xslt, Val} -> [encode_dataform_xslt(Val, Translate)]; {dataform_xslt, _, _} -> erlang:error({badarg, Opt}); {deliver_notifications, Val} -> [encode_deliver_notifications(Val, Translate)]; {deliver_notifications, _, _} -> erlang:error({badarg, Opt}); {deliver_payloads, Val} -> [encode_deliver_payloads(Val, Translate)]; {deliver_payloads, _, _} -> erlang:error({badarg, Opt}); {description, Val} -> [encode_description(Val, Translate)]; {description, _, _} -> erlang:error({badarg, Opt}); {item_expire, Val} -> [encode_item_expire(Val, Translate)]; {item_expire, _, _} -> erlang:error({badarg, Opt}); {itemreply, Val} -> [encode_itemreply(Val, default, Translate)]; {itemreply, Val, Opts} -> [encode_itemreply(Val, Opts, Translate)]; {language, Val} -> [encode_language(Val, default, Translate)]; {language, Val, Opts} -> [encode_language(Val, Opts, Translate)]; {max_items, Val} -> [encode_max_items(Val, Translate)]; {max_items, _, _} -> erlang:error({badarg, Opt}); {max_payload_size, Val} -> [encode_max_payload_size(Val, Translate)]; {max_payload_size, _, _} -> erlang:error({badarg, Opt}); {node_type, Val} -> [encode_node_type(Val, default, Translate)]; {node_type, Val, Opts} -> [encode_node_type(Val, Opts, Translate)]; {notification_type, Val} -> [encode_notification_type(Val, default, Translate)]; {notification_type, Val, Opts} -> [encode_notification_type(Val, Opts, Translate)]; {notify_config, Val} -> [encode_notify_config(Val, Translate)]; {notify_config, _, _} -> erlang:error({badarg, Opt}); {notify_delete, Val} -> [encode_notify_delete(Val, Translate)]; {notify_delete, _, _} -> erlang:error({badarg, Opt}); {notify_retract, Val} -> [encode_notify_retract(Val, Translate)]; {notify_retract, _, _} -> erlang:error({badarg, Opt}); {notify_sub, Val} -> [encode_notify_sub(Val, Translate)]; {notify_sub, _, _} -> erlang:error({badarg, Opt}); {persist_items, Val} -> [encode_persist_items(Val, Translate)]; {persist_items, _, _} -> erlang:error({badarg, Opt}); {presence_based_delivery, Val} -> [encode_presence_based_delivery(Val, Translate)]; {presence_based_delivery, _, _} -> erlang:error({badarg, Opt}); {publish_model, Val} -> [encode_publish_model(Val, default, Translate)]; {publish_model, Val, Opts} -> [encode_publish_model(Val, Opts, Translate)]; {purge_offline, Val} -> [encode_purge_offline(Val, Translate)]; {purge_offline, _, _} -> erlang:error({badarg, Opt}); {roster_groups_allowed, Val} -> [encode_roster_groups_allowed(Val, default, Translate)]; {roster_groups_allowed, Val, Opts} -> [encode_roster_groups_allowed(Val, Opts, Translate)]; {send_last_published_item, Val} -> [encode_send_last_published_item(Val, default, Translate)]; {send_last_published_item, Val, Opts} -> [encode_send_last_published_item(Val, Opts, Translate)]; {tempsub, Val} -> [encode_tempsub(Val, Translate)]; {tempsub, _, _} -> erlang:error({badarg, Opt}); {subscribe, Val} -> [encode_subscribe(Val, Translate)]; {subscribe, _, _} -> erlang:error({badarg, Opt}); {title, Val} -> [encode_title(Val, Translate)]; {title, _, _} -> erlang:error({badarg, Opt}); {type, Val} -> [encode_type(Val, Translate)]; {type, _, _} -> erlang:error({badarg, Opt}); #xdata_field{} -> [Opt]; _ -> [] end || Opt <- List], FormType = #xdata_field{var = <<"FORM_TYPE">>, type = hidden, values = [<<"http://jabber.org/protocol/pubsub#node_config">>]}, [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#node_config">>}}) 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#node_config">>}}); decode([#xdata_field{var = <<"pubsub#body_xslt">>, values = [Value]} | Fs], Acc, Required) -> try Value of Result -> decode(Fs, [{body_xslt, Result} | Acc], lists:delete(<<"pubsub#body_xslt">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#body_xslt">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#body_xslt">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#body_xslt">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#body_xslt">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#body_xslt">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#children_association_policy">>, values = [Value]} | Fs], Acc, Required) -> try dec_enum(Value, [all, owners, whitelist]) of Result -> decode(Fs, [{children_association_policy, Result} | Acc], lists:delete(<<"pubsub#children_association_policy">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#children_association_policy">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#children_association_policy">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#children_association_policy">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#children_association_policy">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#children_association_policy">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#children_association_whitelist">>, values = Values} | Fs], Acc, Required) -> try [dec_jid(Value) || Value <- Values] of Result -> decode(Fs, [{children_association_whitelist, Result} | Acc], lists:delete(<<"pubsub#children_association_whitelist">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#children_association_whitelist">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#children">>, values = Values} | Fs], Acc, Required) -> try [Value || Value <- Values] of Result -> decode(Fs, [{children, Result} | Acc], lists:delete(<<"pubsub#children">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#children">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#children_max">>, values = [Value]} | Fs], Acc, Required) -> try Value of Result -> decode(Fs, [{children_max, Result} | Acc], lists:delete(<<"pubsub#children_max">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#children_max">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#children_max">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#children_max">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#children_max">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#children_max">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#collection">>, values = Values} | Fs], Acc, Required) -> try [Value || Value <- Values] of Result -> decode(Fs, [{collection, Result} | Acc], lists:delete(<<"pubsub#collection">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#collection">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#contact">>, values = Values} | Fs], Acc, Required) -> try [dec_jid(Value) || Value <- Values] of Result -> decode(Fs, [{contact, Result} | Acc], lists:delete(<<"pubsub#contact">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#contact">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#dataform_xslt">>, values = [Value]} | Fs], Acc, Required) -> try Value of Result -> decode(Fs, [{dataform_xslt, Result} | Acc], lists:delete(<<"pubsub#dataform_xslt">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#dataform_xslt">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#dataform_xslt">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#dataform_xslt">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#dataform_xslt">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#dataform_xslt">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#deliver_notifications">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{deliver_notifications, Result} | Acc], lists:delete(<<"pubsub#deliver_notifications">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#deliver_notifications">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#deliver_notifications">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#deliver_notifications">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#deliver_notifications">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#deliver_notifications">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#deliver_payloads">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{deliver_payloads, Result} | Acc], lists:delete(<<"pubsub#deliver_payloads">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#deliver_payloads">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#deliver_payloads">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#deliver_payloads">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#deliver_payloads">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#deliver_payloads">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#description">>, values = [Value]} | Fs], Acc, Required) -> try Value of Result -> decode(Fs, [{description, Result} | Acc], lists:delete(<<"pubsub#description">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#description">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#description">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#description">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#description">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#description">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#item_expire">>, values = [Value]} | Fs], Acc, Required) -> try Value of Result -> decode(Fs, [{item_expire, Result} | Acc], lists:delete(<<"pubsub#item_expire">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#item_expire">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#item_expire">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#item_expire">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#item_expire">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#item_expire">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#itemreply">>, values = [Value]} | Fs], Acc, Required) -> try dec_enum(Value, [owner, publisher, none]) of Result -> decode(Fs, [{itemreply, Result} | Acc], lists:delete(<<"pubsub#itemreply">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#itemreply">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#itemreply">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#itemreply">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#itemreply">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#itemreply">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#language">>, values = [Value]} | Fs], Acc, Required) -> try Value of Result -> decode(Fs, [{language, Result} | Acc], lists:delete(<<"pubsub#language">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#language">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#language">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#language">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#language">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#language">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#max_items">>, values = [Value]} | Fs], Acc, Required) -> try dec_int(Value, 0, infinity) of Result -> decode(Fs, [{max_items, Result} | Acc], lists:delete(<<"pubsub#max_items">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#max_items">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#max_items">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#max_items">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#max_items">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#max_items">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#max_payload_size">>, values = [Value]} | Fs], Acc, Required) -> try dec_int(Value, 0, infinity) of Result -> decode(Fs, [{max_payload_size, Result} | Acc], lists:delete(<<"pubsub#max_payload_size">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#max_payload_size">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#max_payload_size">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#max_payload_size">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#max_payload_size">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#max_payload_size">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#node_type">>, values = [Value]} | Fs], Acc, Required) -> try dec_enum(Value, [leaf, collection]) of Result -> decode(Fs, [{node_type, Result} | Acc], lists:delete(<<"pubsub#node_type">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#node_type">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#node_type">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#node_type">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#node_type">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#node_type">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#notification_type">>, values = [Value]} | Fs], Acc, Required) -> try dec_enum(Value, [normal, headline]) of Result -> decode(Fs, [{notification_type, Result} | Acc], lists:delete(<<"pubsub#notification_type">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#notification_type">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#notification_type">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#notification_type">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#notification_type">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#notification_type">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#notify_config">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{notify_config, Result} | Acc], lists:delete(<<"pubsub#notify_config">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#notify_config">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#notify_config">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#notify_config">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#notify_config">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#notify_config">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#notify_delete">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{notify_delete, Result} | Acc], lists:delete(<<"pubsub#notify_delete">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#notify_delete">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#notify_delete">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#notify_delete">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#notify_delete">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#notify_delete">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#notify_retract">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{notify_retract, Result} | Acc], lists:delete(<<"pubsub#notify_retract">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#notify_retract">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#notify_retract">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#notify_retract">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#notify_retract">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#notify_retract">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#notify_sub">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{notify_sub, Result} | Acc], lists:delete(<<"pubsub#notify_sub">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#notify_sub">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#notify_sub">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#notify_sub">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#notify_sub">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#notify_sub">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#persist_items">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{persist_items, Result} | Acc], lists:delete(<<"pubsub#persist_items">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#persist_items">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#persist_items">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#persist_items">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#persist_items">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#persist_items">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#presence_based_delivery">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{presence_based_delivery, Result} | Acc], lists:delete(<<"pubsub#presence_based_delivery">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#presence_based_delivery">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#presence_based_delivery">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#presence_based_delivery">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#presence_based_delivery">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#presence_based_delivery">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#publish_model">>, values = [Value]} | Fs], Acc, Required) -> try dec_enum(Value, [publishers, subscribers, open]) of Result -> decode(Fs, [{publish_model, Result} | Acc], lists:delete(<<"pubsub#publish_model">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#publish_model">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#publish_model">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#publish_model">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#publish_model">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#publish_model">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#purge_offline">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{purge_offline, Result} | Acc], lists:delete(<<"pubsub#purge_offline">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#purge_offline">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#purge_offline">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#purge_offline">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#purge_offline">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#purge_offline">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#roster_groups_allowed">>, values = Values} | Fs], Acc, Required) -> try [Value || Value <- Values] of Result -> decode(Fs, [{roster_groups_allowed, Result} | Acc], lists:delete(<<"pubsub#roster_groups_allowed">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#roster_groups_allowed">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#send_last_published_item">>, values = [Value]} | Fs], Acc, Required) -> try dec_enum(Value, [never, on_sub, on_sub_and_presence]) of Result -> decode(Fs, [{send_last_published_item, Result} | Acc], lists:delete(<<"pubsub#send_last_published_item">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#send_last_published_item">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#send_last_published_item">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#send_last_published_item">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#send_last_published_item">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#send_last_published_item">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#tempsub">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{tempsub, Result} | Acc], lists:delete(<<"pubsub#tempsub">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#tempsub">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#tempsub">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#tempsub">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#tempsub">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#tempsub">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#subscribe">>, values = [Value]} | Fs], Acc, Required) -> try dec_bool(Value) of Result -> decode(Fs, [{subscribe, Result} | Acc], lists:delete(<<"pubsub#subscribe">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#subscribe">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#subscribe">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#subscribe">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#subscribe">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#subscribe">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#title">>, values = [Value]} | Fs], Acc, Required) -> try Value of Result -> decode(Fs, [{title, Result} | Acc], lists:delete(<<"pubsub#title">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#title">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#title">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#title">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#title">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#title">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = <<"pubsub#type">>, values = [Value]} | Fs], Acc, Required) -> try Value of Result -> decode(Fs, [{type, Result} | Acc], lists:delete(<<"pubsub#type">>, Required)) catch _:_ -> erlang:error({?MODULE, {bad_var_value, <<"pubsub#type">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}) end; decode([#xdata_field{var = <<"pubsub#type">>, values = []} = F | Fs], Acc, Required) -> decode([F#xdata_field{var = <<"pubsub#type">>, values = [<<>>]} | Fs], Acc, Required); decode([#xdata_field{var = <<"pubsub#type">>} | _], _, _) -> erlang:error({?MODULE, {too_many_values, <<"pubsub#type">>, <<"http://jabber.org/protocol/pubsub#node_config">>}}); decode([#xdata_field{var = Var} | Fs], Acc, Required) -> if Var /= <<"FORM_TYPE">> -> erlang:error({?MODULE, {unknown_var, Var, <<"http://jabber.org/protocol/pubsub#node_config">>}}); true -> decode(Fs, Acc, Required) end; decode([], _, [Var | _]) -> erlang:error({?MODULE, {missing_required_var, Var, <<"http://jabber.org/protocol/pubsub#node_config">>}}); 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(<<"Subscription requests must be approved " "and only subscribers may retrieve items">>), value = <<"authorize">>}, #xdata_option{label = Translate(<<"Anyone may subscribe and retrieve items">>), value = <<"open">>}, #xdata_option{label = Translate(<<"Anyone with a presence subscription " "of both or from may subscribe and retrieve " "items">>), value = <<"presence">>}, #xdata_option{label = Translate(<<"Anyone in the specified roster group(s) " "may subscribe and retrieve items">>), value = <<"roster">>}, #xdata_option{label = Translate(<<"Only those on a whitelist may subscribe " "and retrieve items">>), 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">>)}. encode_body_xslt(Value, Translate) -> Values = case Value of <<>> -> []; Value -> [Value] end, Opts = [], #xdata_field{var = <<"pubsub#body_xslt">>, values = Values, required = false, type = 'text-single', options = Opts, desc = <<>>, label = Translate(<<"The URL of an XSL transformation which " "can be applied to payloads in order " "to generate an appropriate message body " "element.">>)}. encode_children_association_policy(Value, Options, Translate) -> Values = case Value of undefined -> []; Value -> [enc_enum(Value)] end, Opts = if Options == default -> [#xdata_option{label = Translate(<<"Anyone may associate leaf nodes with " "the collection">>), value = <<"all">>}, #xdata_option{label = Translate(<<"Only collection node owners may associate " "leaf nodes with the collection">>), value = <<"owners">>}, #xdata_option{label = Translate(<<"Only those on a whitelist may associate " "leaf nodes with the collection">>), value = <<"whitelist">>}]; true -> [#xdata_option{label = Translate(L), value = enc_enum(V)} || {L, V} <- Options] end, #xdata_field{var = <<"pubsub#children_association_policy">>, values = Values, required = false, type = 'list-single', options = Opts, desc = <<>>, label = Translate(<<"Who may associate leaf nodes with a " "collection">>)}. encode_children_association_whitelist(Value, Translate) -> Values = case Value of [] -> []; Value -> [enc_jid(V) || V <- Value] end, Opts = [], #xdata_field{var = <<"pubsub#children_association_whitelist">>, values = Values, required = false, type = 'jid-multi', options = Opts, desc = <<>>, label = Translate(<<"The list of JIDs that may associate " "leaf nodes with a collection">>)}. encode_children(Value, Translate) -> Values = case Value of [] -> []; Value -> [Value] end, Opts = [], #xdata_field{var = <<"pubsub#children">>, values = Values, required = false, type = 'text-multi', options = Opts, desc = <<>>, label = Translate(<<"The child nodes (leaf or collection) " "associated with a collection">>)}. encode_children_max(Value, Translate) -> Values = case Value of <<>> -> []; Value -> [Value] end, Opts = [], #xdata_field{var = <<"pubsub#children_max">>, values = Values, required = false, type = 'text-single', options = Opts, desc = <<>>, label = Translate(<<"The maximum number of child nodes that " "can be associated with a collection">>)}. encode_collection(Value, Translate) -> Values = case Value of [] -> []; Value -> [Value] end, Opts = [], #xdata_field{var = <<"pubsub#collection">>, values = Values, required = false, type = 'text-multi', options = Opts, desc = <<>>, label = Translate(<<"The collections with which a node is " "affiliated">>)}. encode_contact(Value, Translate) -> Values = case Value of [] -> []; Value -> [enc_jid(V) || V <- Value] end, Opts = [], #xdata_field{var = <<"pubsub#contact">>, values = Values, required = false, type = 'jid-multi', options = Opts, desc = <<>>, label = Translate(<<"The JIDs of those to contact with questions">>)}. encode_dataform_xslt(Value, Translate) -> Values = case Value of <<>> -> []; Value -> [Value] end, Opts = [], #xdata_field{var = <<"pubsub#dataform_xslt">>, values = Values, required = false, type = 'text-single', options = Opts, desc = <<>>, label = Translate(<<"The URL of an XSL transformation which " "can be applied to the payload format " "in order to generate a valid Data Forms " "result that the client could display " "using a generic Data Forms rendering " "engine">>)}. encode_deliver_notifications(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#deliver_notifications">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Deliver event notifications">>)}. encode_deliver_payloads(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#deliver_payloads">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Deliver payloads with event notifications">>)}. encode_description(Value, Translate) -> Values = case Value of <<>> -> []; Value -> [Value] end, Opts = [], #xdata_field{var = <<"pubsub#description">>, values = Values, required = false, type = 'text-single', options = Opts, desc = <<>>, label = Translate(<<"A description of the node">>)}. encode_item_expire(Value, Translate) -> Values = case Value of <<>> -> []; Value -> [Value] end, Opts = [], #xdata_field{var = <<"pubsub#item_expire">>, values = Values, required = false, type = 'text-single', options = Opts, desc = <<>>, label = Translate(<<"Number of seconds after which to automaticall" "y purge items">>)}. encode_itemreply(Value, Options, Translate) -> Values = case Value of undefined -> []; Value -> [enc_enum(Value)] end, Opts = if Options == default -> [#xdata_option{label = Translate(<<"Statically specify a replyto of the " "node owner(s)">>), value = <<"owner">>}, #xdata_option{label = Translate(<<"Dynamically specify a replyto of the " "item publisher">>), value = <<"publisher">>}, #xdata_option{value = <<"none">>}]; true -> [#xdata_option{label = Translate(L), value = enc_enum(V)} || {L, V} <- Options] end, #xdata_field{var = <<"pubsub#itemreply">>, values = Values, required = false, type = 'list-single', options = Opts, desc = <<>>, label = Translate(<<"Whether owners or publisher should receive " "replies to items">>)}. encode_language(Value, Options, Translate) -> Values = case Value of <<>> -> []; Value -> [Value] end, Opts = if Options == default -> []; true -> [#xdata_option{label = Translate(L), value = V} || {L, V} <- Options] end, #xdata_field{var = <<"pubsub#language">>, values = Values, required = false, type = 'list-single', options = Opts, desc = <<>>, label = Translate(<<"The default language of the node">>)}. encode_max_items(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_int(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#max_items">>, values = Values, required = false, type = 'text-single', options = Opts, desc = <<>>, label = Translate(<<"Max # of items to persist">>)}. encode_max_payload_size(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_int(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#max_payload_size">>, values = Values, required = false, type = 'text-single', options = Opts, desc = <<>>, label = Translate(<<"Max payload size in bytes">>)}. encode_node_type(Value, Options, Translate) -> Values = case Value of undefined -> []; Value -> [enc_enum(Value)] end, Opts = if Options == default -> [#xdata_option{label = Translate(<<"The node is a leaf node (default)">>), value = <<"leaf">>}, #xdata_option{label = Translate(<<"The node is a collection node">>), value = <<"collection">>}]; true -> [#xdata_option{label = Translate(L), value = enc_enum(V)} || {L, V} <- Options] end, #xdata_field{var = <<"pubsub#node_type">>, values = Values, required = false, type = 'list-single', options = Opts, desc = <<>>, label = Translate(<<"Whether the node is a leaf (default) " "or a collection">>)}. encode_notification_type(Value, Options, Translate) -> Values = case Value of undefined -> []; Value -> [enc_enum(Value)] end, Opts = if Options == default -> [#xdata_option{label = Translate(<<"Messages of type normal">>), value = <<"normal">>}, #xdata_option{label = Translate(<<"Messages of type headline">>), value = <<"headline">>}]; true -> [#xdata_option{label = Translate(L), value = enc_enum(V)} || {L, V} <- Options] end, #xdata_field{var = <<"pubsub#notification_type">>, values = Values, required = false, type = 'list-single', options = Opts, desc = <<>>, label = Translate(<<"Specify the event message type">>)}. encode_notify_config(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#notify_config">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Notify subscribers when the node configuratio" "n changes">>)}. encode_notify_delete(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#notify_delete">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Notify subscribers when the node is " "deleted">>)}. encode_notify_retract(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#notify_retract">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Notify subscribers when items are removed " "from the node">>)}. encode_notify_sub(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#notify_sub">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Whether to notify owners about new subscriber" "s and unsubscribes">>)}. encode_persist_items(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#persist_items">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Persist items to storage">>)}. encode_presence_based_delivery(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#presence_based_delivery">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Only deliver notifications to available " "users">>)}. encode_publish_model(Value, Options, Translate) -> Values = case Value of undefined -> []; Value -> [enc_enum(Value)] end, Opts = if Options == default -> [#xdata_option{label = Translate(<<"Only publishers may publish">>), value = <<"publishers">>}, #xdata_option{label = Translate(<<"Subscribers may publish">>), value = <<"subscribers">>}, #xdata_option{label = Translate(<<"Anyone may publish">>), value = <<"open">>}]; true -> [#xdata_option{label = Translate(L), value = enc_enum(V)} || {L, V} <- Options] end, #xdata_field{var = <<"pubsub#publish_model">>, values = Values, required = false, type = 'list-single', options = Opts, desc = <<>>, label = Translate(<<"Specify the publisher model">>)}. encode_purge_offline(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#purge_offline">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Purge all items when the relevant publisher " "goes offline">>)}. encode_roster_groups_allowed(Value, Options, Translate) -> Values = case Value of [] -> []; Value -> [Value] end, Opts = if Options == default -> []; true -> [#xdata_option{label = Translate(L), value = V} || {L, V} <- Options] end, #xdata_field{var = <<"pubsub#roster_groups_allowed">>, values = Values, required = false, type = 'list-multi', options = Opts, desc = <<>>, label = Translate(<<"Roster groups allowed to subscribe">>)}. encode_send_last_published_item(Value, Options, Translate) -> Values = case Value of undefined -> []; Value -> [enc_enum(Value)] end, Opts = if Options == default -> [#xdata_option{label = Translate(<<"Never">>), value = <<"never">>}, #xdata_option{label = Translate(<<"When a new subscription is processed">>), value = <<"on_sub">>}, #xdata_option{label = Translate(<<"When a new subscription is processed " "and whenever a subscriber comes online">>), value = <<"on_sub_and_presence">>}]; true -> [#xdata_option{label = Translate(L), value = enc_enum(V)} || {L, V} <- Options] end, #xdata_field{var = <<"pubsub#send_last_published_item">>, values = Values, required = false, type = 'list-single', options = Opts, desc = <<>>, label = Translate(<<"When to send the last published item">>)}. encode_tempsub(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#tempsub">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Whether to make all subscriptions temporary, " "based on subscriber presence">>)}. encode_subscribe(Value, Translate) -> Values = case Value of undefined -> []; Value -> [enc_bool(Value)] end, Opts = [], #xdata_field{var = <<"pubsub#subscribe">>, values = Values, required = false, type = boolean, options = Opts, desc = <<>>, label = Translate(<<"Whether to allow subscriptions">>)}. encode_title(Value, Translate) -> Values = case Value of <<>> -> []; Value -> [Value] end, Opts = [], #xdata_field{var = <<"pubsub#title">>, values = Values, required = false, type = 'text-single', options = Opts, desc = <<>>, label = Translate(<<"A friendly name for the node">>)}. encode_type(Value, Translate) -> Values = case Value of <<>> -> []; Value -> [Value] end, Opts = [], #xdata_field{var = <<"pubsub#type">>, values = Values, required = false, type = 'text-single', options = Opts, desc = <<>>, label = Translate(<<"The type of node data, usually specified " "by the namespace of the payload (if " "any)">>)}.