Merge branch 'worktree-endpoints' into macros
This commit is contained in:
@@ -181,8 +181,14 @@ def make_macro(params, rest_param, body, env, name=None):
|
||||
closure=dict(env), name=name)
|
||||
|
||||
|
||||
def make_handler_def(name, params, body, env):
|
||||
return HandlerDef(name=name, params=list(params), body=body, closure=dict(env))
|
||||
def make_handler_def(name, params, body, env, opts=None):
|
||||
path = opts.get('path') if opts else None
|
||||
method = str(opts.get('method', 'get')) if opts else 'get'
|
||||
csrf = opts.get('csrf', True) if opts else True
|
||||
if isinstance(csrf, str):
|
||||
csrf = csrf.lower() not in ('false', 'nil', 'no')
|
||||
return HandlerDef(name=name, params=list(params), body=body, closure=dict(env),
|
||||
path=path, method=method.lower(), csrf=csrf)
|
||||
|
||||
|
||||
def make_query_def(name, params, doc, body, env):
|
||||
@@ -1855,14 +1861,43 @@ def parse_key_params(params_expr):
|
||||
params.append(name)
|
||||
return params
|
||||
|
||||
# parse-handler-args
|
||||
def parse_handler_args(args):
|
||||
_cells = {}
|
||||
'Parse defhandler args after the name symbol.\n Scans for :keyword value option pairs, then a list (params), then body.\n Returns dict with keys: opts, params, body.'
|
||||
opts = {}
|
||||
_cells['params'] = []
|
||||
_cells['body'] = NIL
|
||||
_cells['i'] = 0
|
||||
n = len(args)
|
||||
_cells['done'] = False
|
||||
for idx in range(0, n):
|
||||
if sx_truthy(((not sx_truthy(_cells['done'])) if not sx_truthy((not sx_truthy(_cells['done']))) else (idx == _cells['i']))):
|
||||
arg = nth(args, idx)
|
||||
if sx_truthy((type_of(arg) == 'keyword')):
|
||||
if sx_truthy(((idx + 1) < n)):
|
||||
val = nth(args, (idx + 1))
|
||||
opts[keyword_name(arg)] = (keyword_name(val) if sx_truthy((type_of(val) == 'keyword')) else val)
|
||||
_cells['i'] = (idx + 2)
|
||||
elif sx_truthy((type_of(arg) == 'list')):
|
||||
_cells['params'] = parse_key_params(arg)
|
||||
if sx_truthy(((idx + 1) < n)):
|
||||
_cells['body'] = nth(args, (idx + 1))
|
||||
_cells['done'] = True
|
||||
else:
|
||||
_cells['body'] = arg
|
||||
_cells['done'] = True
|
||||
return {'opts': opts, 'params': _cells['params'], 'body': _cells['body']}
|
||||
|
||||
# sf-defhandler
|
||||
def sf_defhandler(args, env):
|
||||
name_sym = first(args)
|
||||
params_raw = nth(args, 1)
|
||||
body = nth(args, 2)
|
||||
name = symbol_name(name_sym)
|
||||
params = parse_key_params(params_raw)
|
||||
hdef = make_handler_def(name, params, body, env)
|
||||
parsed = parse_handler_args(rest(args))
|
||||
opts = get(parsed, 'opts')
|
||||
params = get(parsed, 'params')
|
||||
body = get(parsed, 'body')
|
||||
hdef = make_handler_def(name, params, body, env, opts)
|
||||
env[sx_str('handler:', name)] = hdef
|
||||
return hdef
|
||||
|
||||
|
||||
Reference in New Issue
Block a user