diff --git a/src/librustdoc/html/render/ordered_json.rs b/src/librustdoc/html/render/ordered_json.rs index d1dddfebc83a2..f7995344a1382 100644 --- a/src/librustdoc/html/render/ordered_json.rs +++ b/src/librustdoc/html/render/ordered_json.rs @@ -32,6 +32,10 @@ impl OrderedJson { let items = items.into_iter().format_with(",", |item, f| f(item.borrow())); Self(format!("[{items}]")) } + + pub(crate) fn array_builder() -> OrderedJsonBuilder { + OrderedJsonBuilder::default() + } } impl fmt::Display for OrderedJson { @@ -79,5 +83,32 @@ impl fmt::Display for EscapedJson { } } +/// Builds an json array. +#[derive(Default)] +pub(crate) struct OrderedJsonBuilder { + partial: Vec, +} + +impl OrderedJsonBuilder { + pub(crate) fn push(&mut self, item: impl Serialize) -> &mut Self { + if self.partial.is_empty() { + self.partial.push(b'['); + } else { + self.partial.push(b','); + } + serde_json::to_writer(&mut self.partial, &item).expect("serialization failed"); + self + } + + pub(crate) fn build(&mut self) -> OrderedJson { + let mut out = std::mem::take(&mut self.partial); + if out.is_empty() { + return OrderedJson("[]".to_string()); + } + out.push(b']'); + OrderedJson(String::from_utf8(out).expect("serialization bug: json is invalid utf8")) + } +} + #[cfg(test)] mod tests; diff --git a/src/librustdoc/html/render/search_index.rs b/src/librustdoc/html/render/search_index.rs index aff8684ee3a09..36b59dce6b035 100644 --- a/src/librustdoc/html/render/search_index.rs +++ b/src/librustdoc/html/render/search_index.rs @@ -796,10 +796,8 @@ pub(crate) fn build_index( desc_index, empty_desc, }; - let index = OrderedJson::array_unsorted([ - OrderedJson::serialize(crate_name.as_str()).unwrap(), - OrderedJson::serialize(data).unwrap(), - ]); + + let index = OrderedJson::array_builder().push(crate_name.as_str()).push(data).build(); SerializedSearchIndex { index, desc } } diff --git a/src/librustdoc/html/static/js/rustdoc.d.ts b/src/librustdoc/html/static/js/rustdoc.d.ts index 0d2e19e019f34..8be45079aaece 100644 --- a/src/librustdoc/html/static/js/rustdoc.d.ts +++ b/src/librustdoc/html/static/js/rustdoc.d.ts @@ -129,7 +129,7 @@ declare namespace rustdoc { /** * A single parsed "atom" in a search query. For example, - * + * * std::fmt::Formatter, Write -> Result<()> * ┏━━━━━━━━━━━━━━━━━━ ┌──── ┏━━━━━┅┅┅┅┄┄┄┄┄┄┄┄┄┄┄┄┄┄┐ * ┃ │ ┗ QueryElement { ┊