# Port [meshoptimizer] to safe, panic-free Rust
**Goal: Port the functionality of [meshoptimizer] to an ergonomic pure Rust library that is fully safe and panic-free on arbitrary user input**
Previous/related work:
- [meshopt-rs] previous port but seems dead/unmaintained. Could be a start.
Alternatives
- Use existing [meshopt] Rust layer, which wraps the C++ [meshoptimizer] library, but compile and use it in WASM to sandbox it and guarantee to keep it safe.
- Pros:
- Easier & faster to do
- Cons:
- More custom host, less useful for others
- Less ergonomic to use as [meshopt] lacks features and is not fully maintained
- Harder to outsource the work, has to be done inside team
## Requirements
### Environment
- Support Rust 1.58+ or "latest stable"
- Support Rust targets
- aarch64-apple-darwin
- aarch64-linux-android
- x86_64-apple-darwin
- x86_64-pc-windows-msvc
- x86_64-unknown-linux-gnu
- x86_64-unknown-linux-musl
- wasm32-unknown-unknown
- wasm32-wasi
### Features
- Support all functionality that [meshoptimizer] supports
- TBD: Determine which functionality we use and want to prioritize first, some other parts could be optional
### Code
- No or very minimal dependencies
- No usage of proc macros
- No usage of `build.rs` in the crate itself
- No panics on any user input, handles all possible errors with user input and returns structured enum errors to caller with context of error.
- Crate uses [Embark standard Clippy lints v0.5](https://github.com/EmbarkStudios/rust-ecosystem/issues/59) (or later)
- Crate uses [safety lints](#safety-lints)
- Crate can be built & tested without any unsafe code (`#[forbid(unsafe_code)`)
- Crate can be built and run in `wasm32-unknown-unknown` and `wasm32-wasi` target
- Good user documentation of crate for docs.rs
### Testing
- Has automatic test suite with that verifies output of crate and original C library is identical across set of tests
- Repository is setup to use CI through GitHub actions and build and run full test suite on Mac, Windows, Linux and wasm32-wasi on every PR
### Project
- Project is in public GitHub repository
- Project & repository uses and follows the [Contributor Covenant ](https://www.contributor-covenant.org/) Code of Conduct.
- Project & crate uses permissive licenses: `MIT OR Apache-2.0`
- Crate is published on crates.io
- Rust semantic versioning is followed, with tagged release in GitHub project
- Optional
- Have an optional `performance` feature that does use documented and verified-to-be-sound `unsafe` blocks for improved performance. Use lints `unsafe_op_in_unsafe_fn` and `undocumented_unsafe_blocks`
TBD:
- Require full ownership of project and it being on EmbarkStudios github org and crates.io org? Likely
## Acceptance criterias
- Crate follows all of the [requirements](#requirements)
## Safety lints
We use these additional Clippy lints for code handling arbitrary user data to make sure it is safe and handles all errors and not panic.
```rust
#[deny(
clippy::unimplemented,
clippy::expect_used,
clippy::unwrap_used,
clippy::ok_expect,
clippy::integer_division,
clippy::indexing_slicing,
clippy::mem_forget
)]
```
[meshopt]: https://github.com/gwihlidal/meshopt-rs
[meshopt-rs]: https://github.com/yzsolt/meshopt-rs
[meshoptimizer]: https://github.com/zeux/meshoptimizer