function.py 1.6 KB

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