use crate::test_optimization::lib::*;
use crate::test_optimization::utils::*;
use std::collections::HashMap;
use std::ffi::CStr;
use std::time::{Duration, SystemTime};
#[derive(Debug, Clone)]
pub struct MockSpan {
#[allow(dead_code)]
pub span_id: u64,
#[allow(dead_code)]
pub trace_id: u64,
#[allow(dead_code)]
pub parent_span_id: u64,
#[allow(dead_code)]
pub start_time: SystemTime,
#[allow(dead_code)]
pub finish_time: SystemTime,
#[allow(dead_code)]
pub operation_name: String,
#[allow(dead_code)]
pub string_tags: HashMap<String, String>,
#[allow(dead_code)]
pub number_tags: HashMap<String, f64>,
}
#[derive(Debug, Clone)]
pub struct MockTracer;
impl MockTracer {
#[allow(dead_code)]
pub fn reset() -> bool {
unsafe {
Bool_to_bool(topt_debug_mock_tracer_reset())
}
}
#[allow(dead_code)]
pub fn get_finished_spans() -> Vec<MockSpan> {
unsafe {
let finished_array = topt_debug_mock_tracer_get_finished_spans();
let spans = Self::convert_mock_span_array(&finished_array);
topt_debug_mock_tracer_free_mock_span_array(finished_array);
spans
}
}
#[allow(dead_code)]
pub fn get_open_spans() -> Vec<MockSpan> {
unsafe {
let open_array = topt_debug_mock_tracer_get_open_spans();
let spans = Self::convert_mock_span_array(&open_array);
topt_debug_mock_tracer_free_mock_span_array(open_array);
spans
}
}
fn convert_unix_time(ut: &topt_UnixTime) -> SystemTime {
SystemTime::UNIX_EPOCH + Duration::new(ut.sec, ut.nsec as u32)
}
fn convert_key_value_array(array: &topt_KeyValueArray) -> HashMap<String, String> {
let mut map = HashMap::new();
if !array.data.is_null() {
for i in 0..array.len {
let pair = unsafe { &*array.data.add(i) };
let key = if pair.key.is_null() {
String::new()
} else {
unsafe { CStr::from_ptr(pair.key).to_string_lossy().into_owned() }
};
let value = if pair.value.is_null() {
String::new()
} else {
unsafe { CStr::from_ptr(pair.value).to_string_lossy().into_owned() }
};
map.insert(key, value);
}
}
map
}
fn convert_key_number_array(array: &topt_KeyNumberArray) -> HashMap<String, f64> {
let mut map = HashMap::new();
if !array.data.is_null() {
for i in 0..array.len {
let pair = unsafe { &*array.data.add(i) };
let key = if pair.key.is_null() {
String::new()
} else {
unsafe { CStr::from_ptr(pair.key).to_string_lossy().into_owned() }
};
map.insert(key, pair.value);
}
}
map
}
fn convert_mock_span(mock: &topt_MockSpan) -> MockSpan {
MockSpan {
span_id: mock.span_id,
trace_id: mock.trace_id,
parent_span_id: mock.parent_span_id,
start_time: Self::convert_unix_time(&mock.start_time),
finish_time: Self::convert_unix_time(&mock.finish_time),
operation_name: if mock.operation_name.is_null() {
String::new()
} else {
unsafe { CStr::from_ptr(mock.operation_name).to_string_lossy().into_owned() }
},
string_tags: Self::convert_key_value_array(&mock.string_tags),
number_tags: Self::convert_key_number_array(&mock.number_tags),
}
}
fn convert_mock_span_array(array: &topt_MockSpanArray) -> Vec<MockSpan> {
let mut vec = Vec::with_capacity(array.len);
if !array.data.is_null() {
for i in 0..array.len {
let mock_span = unsafe { &*array.data.add(i) };
vec.push(Self::convert_mock_span(mock_span));
}
}
vec
}
}