function.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from .writer import Writer
  2. from .converters import get_converter
  3. from .schema import Function
  4. def gen_function(w: Writer, pyi_w: Writer, function: Function):
  5. name = function.name
  6. w.write(f'static bool cfunc__{name}(int argc, py_Ref argv) {{')
  7. w.indent()
  8. w.write(f'PY_CHECK_ARGC({len(function.params)});')
  9. args_cvt = [get_converter(arg.type) for arg in function.params]
  10. ret_cvt = get_converter(function.ret_type)
  11. for i in range(len(args_cvt)):
  12. w.write(f'{args_cvt[i].T} _{i};')
  13. args_cvt[i].py2c(w, f'_{i}', f'py_arg({i})')
  14. call_args = ', '.join([f'_{i}' for i in range(len(args_cvt))])
  15. # gen retval
  16. if function.ret_type == 'void':
  17. w.write(f'{name}({call_args});')
  18. w.write(f'py_newnone(py_retval());')
  19. else:
  20. w.write(f'{ret_cvt.T} res = {name}({call_args});')
  21. ret_cvt.c2py(w, 'py_retval()', 'res')
  22. w.write('return true;')
  23. w.dedent()
  24. w.write('}')
  25. # pyi
  26. py_args = []
  27. # arg_names = [f'_{i}' for i in range(len(args_cvt))]
  28. arg_names = [arg.name for arg in function.params]
  29. for i in range(len(args_cvt)):
  30. py_args.append(f'{arg_names[i]}: {args_cvt[i].py_T}')
  31. pyi_w.write(f'def {name}({", ".join(py_args)}) -> {ret_cvt.py_T}:')
  32. if function.desc:
  33. pyi_w.write(f' """Wraps `{function.signature()}`\n\n {function.desc}"""')
  34. else:
  35. pyi_w.write(f' """Wraps `{function.signature()}`"""')
  36. pyi_w.write('')