use serde::Serialize;
use serde_json::Value;
use super::timestamp::Timestamp;
#[derive(Debug, Clone)]
pub enum MarkerTiming {
Instant(Timestamp),
Interval(Timestamp, Timestamp),
IntervalStart(Timestamp),
IntervalEnd(Timestamp),
}
pub trait ProfilerMarker {
const MARKER_TYPE_NAME: &'static str;
fn schema() -> MarkerSchema;
fn json_marker_data(&self) -> Value;
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MarkerSchema {
#[serde(rename = "name")]
pub type_name: &'static str,
#[serde(rename = "display")]
pub locations: Vec<MarkerLocation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chart_label: Option<&'static str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tooltip_label: Option<&'static str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub table_label: Option<&'static str>,
#[serde(rename = "data")]
pub fields: Vec<MarkerSchemaField>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum MarkerLocation {
MarkerChart,
MarkerTable,
TimelineOverview,
TimelineMemory,
TimelineIPC,
#[serde(rename = "timeline-fileio")]
TimelineFileIO,
StackChart,
}
#[derive(Debug, Clone, Serialize)]
#[serde(untagged)]
pub enum MarkerSchemaField {
Static(MarkerStaticField),
Dynamic(MarkerDynamicField),
}
#[derive(Debug, Clone, Serialize)]
pub struct MarkerStaticField {
pub label: &'static str,
pub value: &'static str,
}
#[derive(Debug, Clone, Serialize)]
pub struct MarkerDynamicField {
pub key: &'static str,
#[serde(skip_serializing_if = "str::is_empty")]
pub label: &'static str,
pub format: MarkerFieldFormat,
pub searchable: bool,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum MarkerFieldFormat {
Url,
FilePath,
String,
Duration,
Time,
Seconds, Milliseconds, Microseconds, Nanoseconds,
Bytes,
Percentage,
Integer,
Decimal,
}