Передача строки из python в rust с помощью SWIG

#python #rust #swig #swig-typemap

Вопрос:

Я работаю над созданием библиотеки на rust, которая, по моему мнению, была бы чрезвычайно полезна на других языках. Я хотел бы предоставить эту функциональность с идиоматическими привязками как можно большему числу языков с минимальными усилиями, которые мне сойдут с рук. Очевидно, что SWIG-отличный выбор для этого проекта.

Я использую фантастический проект под названием safer_ffi для создания интерфейса C для библиотеки rust. Это устраняет большую часть подверженной ошибкам котельной плиты со стороны ржавчины, но также ограничивает мои возможности в отношении того, как именно выглядит интерфейс C. В настоящее время он представляет строки с этим типом C:

 typedef struct {
uint8_t * ptr;
size_t len;
} slice_boxed_uint8_t;
 

Я ни за что на свете не могу установить ptr-элемент структуры, не вызвав ошибку типа в python. Мой файл интерфейса просто:

 %module swig_example
%{
/* Includes the header in the wrapper code */
#include "swig_example.h"
%}

%include "stdint.i"
%include "cstring.i"

/* Parse the header file to generate wrappers */
%include "swig_example.h"
 

и я пытаюсь настроить структуру с помощью следующего python:

 def _str_to_slice(input: str) -> slice_boxed_uint8_t:
    slice = slice_boxed_uint8_t()
    slice.ptr = input
    slice.len = len(input)
    return slice
 

что приводит к следующей ошибке «Ошибка типа: в методе ‘slice_boxed_uint8_t_ptr_set’ аргумент 2 типа ‘uint8_t‘». Я перепробовал всевозможные комбинации того, как его вызывать и как создавать привязки. Я просматривал сгенерированный код на языке Си, но пока не обнаружил проблемы. Похоже, он понимает, что этот указатель является символом, но не устанавливает соединение, которое можно использовать в качестве uint8_t*. Возможно, я неправильно понял часть сгенерированного кода на языке Си, я все еще не очень глубоко в этом разбираюсь.

Я сделал все возможное, чтобы включить всю соответствующую информацию, но я знаю, что в этом посте может отсутствовать какой-то важный контекст, поэтому код можно найти здесь. В README.md указывает здесь, чтобы найти все соответствующие файлы, рассуждая о том, как все настроено, и я проверил сгенерированные SWIG файлы c и python. Этот проект-наименьшее подмножество моего первоначального проекта, которое я мог бы упростить для других в устранении неполадок

Огромное спасибо за любую помощь, которую кто-либо может оказать!