use rumtk_core::buffers::buffer_to_string;
use rumtk_core::core::RUMResult;
use rumtk_core::search::rumtk_search::{string_find_value, string_search};
use rumtk_core::strings::{rumtk_format, string_to_buffer, RUMString, RUMStringConversions};
use rumtk_core::types::{RUMBuffer, RUMDeserialize, RUMSerialize};
use rumtk_web::conversions::to_data_uri;
use rumtk_web::RUMWebTemplate;
use std::convert::{From, TryFrom};
use std::fmt::Debug;
#[derive(Default, Debug, RUMDeserialize, RUMSerialize, RUMWebTemplate)]
#[template(
source = "
<object type='image/svg+xml' data='{{data}}' alt='Flamegraph' img='' width='100%'>
</object>
",
ext = "html"
)]
pub struct FlamegraphBenchmarkVisualizer {
pub data: RUMString
}
impl TryFrom<&RUMBuffer> for FlamegraphBenchmarkVisualizer {
type Error = RUMString;
fn try_from(report: &RUMBuffer) -> Result<Self, Self::Error> {
let report_string = buffer_to_string(report)?;
let s = report_string.as_str();
let flamegraph_html = string_find_value::<RUMString>(s, &["(?s)<\\?xml.*</svg>"]).unwrap_or_default();
Ok(Self {
data: to_data_uri(flamegraph_html.as_str(), "image/svg+xml")
})
}
}