Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/denoland/serde_v8
Moved to https://github.com/denoland/deno
https://github.com/denoland/serde_v8
Last synced: 3 months ago
JSON representation
Moved to https://github.com/denoland/deno
- Host: GitHub
- URL: https://github.com/denoland/serde_v8
- Owner: denoland
- License: mit
- Archived: true
- Created: 2021-06-09T15:32:46.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2021-10-11T17:38:31.000Z (about 3 years ago)
- Last Synced: 2024-09-23T21:04:29.011Z (3 months ago)
- Language: Rust
- Homepage: https://github.com/denoland/deno/tree/main/serde_v8
- Size: 102 KB
- Stars: 36
- Watchers: 19
- Forks: 15
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# serde_v8
Author: Aaron O'Mullan
Serde support for encoding/decoding (rusty_)v8 values.
Broadly `serde_v8` aims to provide an expressive but ~maximally efficient
encoding layer to biject rust & v8/js values. It's a core component of deno's
op-layer and is used to encode/decode all non-buffer values.**Original issue:**
[denoland/deno#9540](https://github.com/denoland/deno/issues/9540)## Quickstart
`serde_v8` fits naturally into the serde ecosystem, so if you've already used
`serde` or `serde_json`, `serde_v8`'s API should be very familiar.`serde_v8` exposes two key-functions:
- `to_v8`: maps `rust->v8`, similar to `serde_json::to_string`, ...
- `from_v8`: maps `v8->rust`, similar to `serde_json::from_str`, ...## Best practices
Whilst `serde_v8` is compatible with `serde_json::Value` it's important to keep
in mind that `serde_json::Value` is essentially a loosely-typed value (think
nested HashMaps), so when writing ops we recommend directly using rust
structs/tuples or primitives, since mapping to `serde_json::Value` will add
extra overhead and result in slower ops.I also recommend avoiding unecessary "wrappers", if your op takes a single-keyed
struct, consider unwrapping that as a plain value unless you plan to add fields
in the near-future.Instead of returning "nothing" via `Ok(json!({}))`, change your return type to
rust's unit type `()` and returning `Ok(())`, `serde_v8` will efficiently encode
that as a JS `null`.## Advanced features
If you need to mix rust & v8 values in structs/tuples, you can use the special
`serde_v8::Value` type, which will passthrough the original v8 value untouched
when encoding/decoding.## TODO
- [ ] Experiment with KeyCache to optimize struct keys
- [ ] Experiment with external v8 strings
- [ ] Explore using
[json-stringifier.cc](https://chromium.googlesource.com/v8/v8/+/refs/heads/master/src/json/json-stringifier.cc)'s
fast-paths for arrays
- [ ] Improve tests to test parity with `serde_json` (should be mostly
interchangeable)
- [ ] Consider a `Payload` type that's deserializable by itself (holds scope &
value)
- [ ] Ensure we return errors instead of panicking on `.unwrap()`s