2024-07-05 16:37:15 +02:00
|
|
|
A work-in-progress Firefish backend written in Rust
|
|
|
|
|
|
|
|
Minimum supported Rust version (MSRV): 1.74
|
|
|
|
|
|
|
|
Auto-generated documentation is at <https://docs.firefish.dev/backend_rs>
|
|
|
|
|
|
|
|
# How to write the code
|
|
|
|
|
|
|
|
Currently, there is no entrypoint in this project, and all functions are executed via Node-API.
|
|
|
|
|
|
|
|
You need to apply the [`macros::export`] proc macro to export a function to the Node.js backend:
|
|
|
|
|
|
|
|
```rust,ignore
|
|
|
|
#[macros::export]
|
|
|
|
pub fn to_be_exported(value: &str) -> i32 {
|
|
|
|
// You can also call other functions that are not exported
|
|
|
|
do_something();
|
|
|
|
42
|
|
|
|
}
|
|
|
|
|
|
|
|
fn do_something() {
|
|
|
|
do_other_thing();
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
this code will be translated into this TypeScript code:
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
export declare function toBeExported(value: string): number {
|
|
|
|
/* executes the compiled Rust function */
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
You can also export `async` functions:
|
|
|
|
|
|
|
|
```rust,ignore
|
|
|
|
#[macros::export]
|
|
|
|
pub async fn async_function() -> i32 {
|
|
|
|
some_async_task().await
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
export declare function asyncFunction(): Promise<number> {
|
|
|
|
/* executes the compiled Rust function */
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
You need to specify `object` attribute to export `struct`s:
|
|
|
|
|
|
|
|
```rust,ignore
|
|
|
|
#[macros::export(object)]
|
|
|
|
pub struct Thing {
|
|
|
|
pub field_one: String,
|
|
|
|
pub field_two: Option<String>,
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
export interface Thing {
|
|
|
|
fieldOne: string
|
|
|
|
fieldTwo: string | null
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
# Update auto-generated files
|
|
|
|
|
|
|
|
These files are auto-generated and are not intended for manual editing:
|
|
|
|
- `packages/backend-rs/index.js`
|
|
|
|
- `packages/backend-rs/index.d.ts`
|
|
|
|
- [`packages/backend-rs/src/model/entity/*`](crate::model::entity)
|
|
|
|
|
|
|
|
## Prerequisites
|
|
|
|
|
|
|
|
1. `dev/config.env` (see `dev/config.example.env` for reference)
|
|
|
|
2. PostgreSQL database listening on port `25432`
|
|
|
|
3. Dev dependencies
|
|
|
|
- [GNU Make](<https://www.gnu.org/software/make/>)
|
|
|
|
- [sea-orm-cli](<https://www.sea-ql.org/SeaORM/docs/generate-entity/sea-orm-cli/>)
|
|
|
|
|
|
|
|
## Update database entity
|
|
|
|
|
|
|
|
Run the following command in the repository root directory
|
|
|
|
|
|
|
|
```sh
|
|
|
|
make entities
|
|
|
|
```
|
|
|
|
|
|
|
|
## Update `index.js` and `index.d.ts`
|
|
|
|
|
|
|
|
Run the following command in the repository root directory
|
|
|
|
|
|
|
|
```sh
|
|
|
|
make napi
|
|
|
|
```
|
|
|
|
|
|
|
|
# Unit tests
|
|
|
|
|
|
|
|
It is highly encouraged that you write unit tests and test the code yourself (there is no integration test at this point).
|
|
|
|
|
|
|
|
## Prerequisites
|
|
|
|
|
|
|
|
1. `dev/config.env` (see `dev/config.example.env` for reference)
|
2024-07-05 19:04:24 +02:00
|
|
|
2. Firefish config file (`.config/default.yml`)
|
2024-07-05 16:37:15 +02:00
|
|
|
3. Dev dependency
|
|
|
|
- [cargo-nextest](<https://nexte.st/>)
|
|
|
|
|
|
|
|
## Run unit tests
|
|
|
|
|
|
|
|
Run the following command in the repository root directory
|
|
|
|
|
|
|
|
```sh
|
|
|
|
pnpm run test:rs
|
|
|
|
```
|