-
Notifications
You must be signed in to change notification settings - Fork 13.5k
rustdoc-json: Postcard output #142642
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
rustdoc-json: Postcard output #142642
Conversation
pub mod postcard { | ||
|
||
pub type Magic = [u8; 22]; | ||
pub const MAGIC: Magic = *b"\x00\xFFRustdocJsonPostcard\xFF"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A friend points out https://hackers.town/@zwol/114155807716413069, with advice on how to design a magic number.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Having 'Json' in there seems perverse :)
Something @jamesmunns pointed out is that this means that reordering fields or enum variants in More broadly, we should think about where (if at all) postcard-schema fits into this. |
As a note, I'm working on iterating on
|
A possibly useful form for the file format could be: struct PostcardFile<T> {
key: Key,
schema: Option<Schema>,
data: T,
} I've considered "standardizing" this format a bit, maybe with a trailing CRC32. |
Awesome! It'd be great to not have
I think we definatly want to keep the magic number, so that consumers can tell if this file is rustdoc output at all, and a linear format version so they can tell if rustdoc is too old or too new for them if the schema's changed (vs a schema hash that only tells you that it's changed). Embedded the schema into the output itself is an interesting idea, I'll need to look more at it. But as long as both of these come after the magic number and linear format version, we should be fine to change them after the fact. |
r? @ghost
What
rustdoc --output-format=postcard
is like rustdoc-json, but using https://postcard.rs/ / https://docs.rs/postcard/1.1.1/ instead of JSON.Why
JSON Size and speed isn't great. People want more speed, and smaller docs. There are proposals to make the JSON smaller (and therefor faster) by making field-names shorter, and omitting them when the value is the default. But
How good is it?
In a very unscientific benchmark for aws-sdk-ec2, it's ~3.6x smaller (255MiB vs 69 MiB) and ~1.8x faster to deserialize (1.6273 s vs 914.05 ms)
What's the metaformat
Crate
as usualThis way, users can look at the magic number to check it's a rustdoc-json-postcard file, then read the version number to know if they can decode it. Only then can they deserialize the
Crate
itself. I plan to write a library that does this, so it's easy to do well.Why is this a draft
HtmlRenderer
andJsonRenderer
are configures from the same options, we should change this.is_json()
instead of the current hacks