-module(n4u_cx). -include_lib("n4u/include/n4u.hrl"). -export([context/2, context/3, add_action/1, cookies/0, add_cookie/4, fold/3, init_context/1 ]). % N4U Process Context context(Cx, Proto) -> lists:keyfind(Proto, 1, Cx#cx.state). context(Cx, Proto, UserCx) -> NewCx = Cx#cx{state=setkey(Proto, 1, Cx#cx.state, {Proto, UserCx})}, erlang:put(context, NewCx), NewCx. setkey(Name, Pos, List, New) -> case lists:keyfind(Name, Pos, List) of false -> [New|List]; _Element -> lists:keyreplace(Name, Pos, List, New) end. add_action(Action) -> Actions = case erlang:get(actions) of undefined -> []; E -> E end, erlang:put(actions, Actions ++ [Action]). %clear_actions() -> erlang:put(actions, []). cookies() -> C = erlang:get(cookies), case erlang:is_list(C) of true -> C; _ -> [] end. add_cookie(Name, Value, Path, TTL) -> C = cookies(), Cookies = case lists:keyfind(Name, 1, C) of {Name, _, _, _} -> lists:keyreplace(Name, 1, C, {Name, Value, Path, TTL}); false -> [{Name, Value, Path, TTL}|C] end, erlang:put(cookies, Cookies). fold(Fun, Handlers, Ctx) -> lists:foldl( fun({_, Module}, Ctx1) -> {ok, _, NewCtx} = Module:Fun([], Ctx1), NewCtx end, Ctx, Handlers). init_context(Req) -> #cx{actions=[], module=index, path=[], req=Req, params=[], handlers= [ {'query', application:get_env(n4u, 'query', n4u_query)}, {session, application:get_env(n4u, session, n4u_session)}, {route, application:get_env(n4u, route, n2o_dynroute)} ]}.