Skip to main content

luaur_analysis/functions/
write_json_emitter.rs

1//! Source: `Analysis/include/Luau/JsonEmitter.h` (lines 212-221, hand-ported)
2//!
3//! C++ template:
4//! ```cpp
5//! template<typename T>
6//! void write(JsonEmitter& emitter, const std::vector<T>& vec)
7//! {
8//!     ArrayEmitter a = emitter.writeArray();
9//!     for (const T& value : vec)
10//!         a.writeValue(value);
11//!     a.finish();
12//! }
13//! ```
14
15extern crate alloc;
16
17use crate::methods::object_emitter_write_pair::WriteJson;
18use crate::records::json_emitter::JsonEmitter;
19use alloc::vec::Vec;
20
21pub fn write_json_emitter_vector_t<T: WriteJson>(emitter: &mut JsonEmitter, vec: &Vec<T>) {
22    let mut a = emitter.write_array();
23
24    for value in vec {
25        a.write_value(value);
26    }
27
28    a.finish();
29}
30
31/// `write(JsonEmitter&, const std::vector<T>&)` exposed through the `WriteJson`
32/// overload set so a `std::vector<T>` can be a key value (`writePair`/`writeValue`).
33impl<T: WriteJson> WriteJson for Vec<T> {
34    fn write_json(&self, emitter: &mut JsonEmitter) {
35        write_json_emitter_vector_t(emitter, self);
36    }
37}
38
39/// Slices behave like vectors for the overload set; useful for `&[T]` values.
40impl<T: WriteJson> WriteJson for [T] {
41    fn write_json(&self, emitter: &mut JsonEmitter) {
42        let mut a = emitter.write_array();
43        for value in self {
44            a.write_value(value);
45        }
46        a.finish();
47    }
48}