1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use crate::errors::Result;
use simd_json::prelude::*;
use simd_json::BorrowedValue as Value;
use std::io::prelude::*;
pub fn hostname() -> String {
hostname::get()
.map_err(|_| ())
.and_then(|s| s.into_string().map_err(|_| ()))
.unwrap_or_else(|_| "tremor-host.local".to_string())
}
pub fn sorsorted_serialize(j: &Value) -> Result<String> {
let mut w = Vec::with_capacity(512);
sorted_serialize_(j, &mut w)?;
Ok(std::str::from_utf8(&w)?.to_string())
}
fn sorted_serialize_<'v, W: Write>(j: &Value<'v>, w: &mut W) -> Result<()> {
match j {
Value::Static(_) | Value::String(_) => {
write!(w, "{}", j.encode())?;
}
Value::Array(a) => {
let mut iter = a.iter();
write!(w, "[")?;
if let Some(e) = iter.next() {
sorted_serialize_(e, w)?
}
for e in iter {
write!(w, ",")?;
sorted_serialize_(e, w)?
}
write!(w, "]")?;
}
Value::Object(o) => {
let mut v: Vec<(String, Value<'v>)> =
o.iter().map(|(k, v)| (k.to_string(), v.clone())).collect();
v.sort_by_key(|(k, _)| k.to_string());
let mut iter = v.into_iter();
write!(w, "{{")?;
if let Some((k, v)) = iter.next() {
sorted_serialize_(&Value::from(k), w)?;
write!(w, ":")?;
sorted_serialize_(&v, w)?;
}
for (k, v) in iter {
write!(w, ",")?;
sorted_serialize_(&Value::from(k), w)?;
write!(w, ":")?;
sorted_serialize_(&v, w)?;
}
write!(w, "}}")?;
}
}
Ok(())
}
pub fn load_event_file(name: &str) -> crate::errors::Result<Vec<Value<'static>>> {
use simd_json::to_borrowed_value;
use std::fs::File;
use xz2::read::XzDecoder;
let file = File::open(name)?;
let mut in_data = Vec::new();
XzDecoder::new(file).read_to_end(&mut in_data)?;
let mut in_lines = in_data
.lines()
.collect::<std::result::Result<Vec<String>, _>>()?;
let mut in_bytes = Vec::new();
unsafe {
for line in &mut in_lines {
in_bytes.push(line.as_bytes_mut())
}
}
let mut json = Vec::new();
for bytes in in_bytes {
json.push(to_borrowed_value(bytes)?.into_static())
}
Ok(json)
}