https://github.com/neo-ciber94/multer-derive
A derive implementation for create types from multer Multipart
https://github.com/neo-ciber94/multer-derive
Last synced: 8 months ago
JSON representation
A derive implementation for create types from multer Multipart
- Host: GitHub
- URL: https://github.com/neo-ciber94/multer-derive
- Owner: Neo-Ciber94
- License: mit
- Created: 2023-05-03T03:03:24.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-05-05T02:57:45.000Z (over 2 years ago)
- Last Synced: 2025-02-06T21:16:43.005Z (8 months ago)
- Language: Rust
- Size: 58.6 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# multer-derive
[![CI-badge]](ci) [![Latest Version]][crates.io] [![Docs Badge]][docs]
[CI-badge]: https://github.com/Neo-Ciber94/multer-derive/actions/workflows/ci.yml/badge.svg
[ci]:[Latest Version]: https://img.shields.io/crates/v/multer-derive.svg
[crates.io]: https://crates.io/crates/rust-decimal[Docs Badge]: https://docs.rs/multer-derive/badge.svg
[docs]: https://docs.rs/multer-derive/latestProvides a `FromMultipart` derive for construct types from [multer::Multipart](https://docs.rs/multer/2.1.0/multer/struct.Multipart.html).
## Usage
```rs
use multer_derive::{FormFile, FromMultipart, Multipart, MultipartForm};#[derive(FormMultipart)]
struct Person {
name: String,
email: String,
age: u8,
married: bool,
photo: FormFile
}const FORM_DATA : &str = "--boundary_string\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nJohn Smith\r\n--boundary_string\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njohn@example.com\r\n--boundary_string\r\nContent-Disposition: form-data; name=\"age\"\r\n\r\n25\r\n--boundary_string\r\nContent-Disposition: form-data; name=\"married\"\r\n\r\ntrue\r\n--boundary_string\r\nContent-Disposition: form-data; name=\"photo\"; filename=\"example.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n[Binary data]\r\n--boundary_string--\r\n";
let reader = FORM_DATA.as_bytes();
let multipart = Multipart::with_reader(reader, "boundary_string");let form = MultipartForm::with_multipart(multipart).await.unwrap();
let person = Person::from_multipart(form).unwrap();assert_eq!(person.name, "John Smith");
assert_eq!(person.email, "john@example.com");
assert_eq!(person.age, 25);
assert_eq!(person.married, true);let str = String::from_utf8(person.photo.bytes().to_vec()).unwrap();
assert_eq!(str, "[Binary data]");
```## Attributes
`multer-derive` also support the next attributes to decorate your fields:
- To rename the target you can use `#[multer(rename = "new_field_name")]`
- This will make multer to parse the field using the given name.Example:
```rs
use multer_derive::FromMultipart;#[derive(FromMultipart)]
struct MyStruct {
#[multer(rename = "active")]
is_active: bool
}
```- To parse using a function you can use `#[multer(with = "path::to::function")]`
- For this you should provide a function with the signature:
```rs
fn from_multipart(multipart: &MultipartForm, ctx: FormContext<'_>) -> Result {
todo!()
}
```Example:
```rs
use multer_derive::{FromMultipart, MultipartForm, FormContext, Error};#[derive(FromMultipart)]
struct MyStruct {
#[multer(with = "text_from_multipart")]
name: Text
}struct Text(String);
fn text_from_multipart(
multipart: &MultipartForm,
ctx: FormContext<'_>,
) -> Result {
// This is safe, the `field_name` is always passed
let field_name = ctx.field_name.unwrap();// We search the field in the source multipart
let field = multipart
.get_by_name(field_name)
.ok_or(Error::new(format!(
"`{field_name}` form field was not found"
)))?;// Parse the value using `String`
let s = String::from_field(field)?;
Ok(Text(s))
}
```