Skip to content

Commit

Permalink
feat: support struct with field type stringArr doubleArr
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangyuang committed Oct 19, 2023
1 parent 49e2ab5 commit 31d9beb
Show file tree
Hide file tree
Showing 6 changed files with 321 additions and 195 deletions.
5 changes: 3 additions & 2 deletions cpp/sum.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,16 @@ typedef struct Person {
const char *name;
int age;
double doubleProps;
// char **stringArrProps;
char **stringArrProps;
// Parent parent;
} Person;

extern "C" const Person *getStruct(const Person *person) {
printf("Name: %s\n", person->name);
printf("Age: %d\n", person->age);
printf("doubleProps: %f \n", person->doubleProps);
// printf("stringArrProps: %s\n", person->stringArrProps[0]);
printf("stringArrProps: %s\n", person->stringArrProps[0]);
printf("stringArrProps: %s\n", person->stringArrProps[1]);
// printf("Parent Age: %d\n", person->parent.age);
// printf("Parent Name: %s\n", person->parent.name);
return person;
Expand Down
36 changes: 27 additions & 9 deletions scripts/type.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@ const { readFile, writeFile } = require('fs/promises')
const { resolve } = require('path');

(async () => {
const entryContent = (await readFile(resolve(process.cwd(), './index.js'))).toString()
.replace('paramsType: Array<unknown>', 'paramsType: Array<DataFieldType>')
.replace('retType: unknown', 'retType: DataFieldType')
await writeFile(resolve(process.cwd(), './index.js'), `
${entryContent}
module.exports.arrayConstructor = (options) => ({
...options,
ffiTypeTag: 'array'
})
`)

const typeContent = (await readFile(resolve(process.cwd(), './index.d.ts'))).toString()
.replace('paramsType: Array<unknown>', 'paramsType: Array<DataFieldType>')
.replace('retType: unknown', 'retType: DataFieldType')
Expand All @@ -13,14 +24,6 @@ const { resolve } = require('path');
retType: DataType.I32 | DataType.Double
}): number
export function load(params: FfiParams & {
retType: DataType.I32Array | DataType.DoubleArray
}): Array<number>
export function load(params: FfiParams & {
retType: DataType.StringArray
}): Array<string>
export function load(params: FfiParams & {
retType: DataType.Boolean
}): Boolean
Expand All @@ -41,8 +44,23 @@ const { resolve } = require('path');
never;
};
export function load<T extends Record<string, DataType>>(params: FfiParams & { retType: T }): DataTypeToType<T>
export type ArrayConstructorOptions = {
type: DataType
length: number
}
export function arrayConstructor<T extends ffiTypeTag>(options: ArrayConstructorOptions): ArrayConstructorOptions & {
ffiTypeTag: T
}
type ffiTypeTag = 'double' | 'string' | 'i32';
type FfiReturnType<T extends ffiTypeTag> = T extends 'double' ? number :
T extends 'i32' ? number :
string;
export type DataFieldType = DataType | Record<string, DataType>
export function load<T extends ffiTypeTag>(params: FfiParams & { retType: { ffiTypeTag: T } }): Array<FfiReturnType<T>>
export type DataFieldType = DataType | Record<string, DataType>| ArrayConstructorOptions & {
ffiTypeTag: ffiTypeTag
}
${typeContent}
`)
})()
16 changes: 15 additions & 1 deletion src/define.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use indexmap::IndexMap;
use napi::bindgen_prelude::*;
use napi::{Env, JsObject};
use napi::{Env, JsObject, JsUnknown};
use std::hash::Hash;

#[derive(Clone)]
Expand Down Expand Up @@ -84,3 +84,17 @@ pub enum RsArgsValue {
Void(()),
Function(JsFunction, JsFunction),
}

#[napi(object)]
pub struct FFIParams {
pub library: String,
pub func_name: String,
pub ret_type: JsUnknown,
pub params_type: Vec<JsUnknown>,
pub params_value: Vec<JsUnknown>,
}
#[napi(object)]
pub struct OpenParams {
pub library: String,
pub path: String,
}
Loading

0 comments on commit 31d9beb

Please sign in to comment.