zhc_utils 0.8.2

Shared utilities for the ZHC compiler
Documentation
use serde::Serialize;
use serde_json::Value;
use std::collections::HashMap;

use super::*;

#[derive(Serialize, Debug, Clone, Default)]
pub struct Trace {
    #[serde(rename = "traceEvents")]
    pub trace_events: Vec<Event>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(rename = "displayTimeUnit")]
    pub display_time_unit: Option<Unit>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(rename = "stackFrames")]
    pub stack_frames: Option<HashMap<String, Value>>,
}

impl Trace {
    pub fn new_instant<S: AsRef<str>>(
        &mut self,
        timestamp: Microseconds,
        pid: Pid,
        tid: Tid,
        name: S,
        args: Option<Value>,
        scope: Scope,
    ) {
        self.trace_events.push(Event::Instant(InstantEvent {
            name: name.as_ref().into(),
            timestamp,
            pid,
            tid,
            scope,
            args,
            ..InstantEvent::default()
        }));
    }

    pub fn new_complete<S: AsRef<str>>(
        &mut self,
        timestamp: Microseconds,
        pid: Pid,
        tid: Tid,
        name: S,
        args: Option<Value>,
        duration: Microseconds,
    ) {
        self.trace_events.push(Event::Complete(CompleteEvent {
            name: name.as_ref().into(),
            timestamp,
            duration,
            pid,
            tid,
            args,
            ..CompleteEvent::default()
        }));
    }

    pub fn set_thread_name<S: AsRef<str>>(&mut self, pid: Pid, tid: Tid, name: S) {
        self.trace_events.push(Event::Metadata(MetadataEvent {
            name: Metadata::ThreadName,
            pid,
            tid,
            args: MetadataArgs::ThreadName {
                name: name.as_ref().into(),
            },
            ..MetadataEvent::default()
        }));
    }

    pub fn set_process_name<S: AsRef<str>>(&mut self, pid: Pid, name: S) {
        self.trace_events.push(Event::Metadata(MetadataEvent {
            name: Metadata::ProcessName,
            pid,
            args: MetadataArgs::ProcessName {
                name: name.as_ref().into(),
            },
            ..MetadataEvent::default()
        }));
    }

    pub fn new_counter<S: AsRef<str>>(
        &mut self,
        timestamp: Microseconds,
        pid: Pid,
        tid: Tid,
        name: S,
        args: Option<Value>,
    ) {
        self.trace_events.push(Event::Counter(CounterEvent {
            name: name.as_ref().into(),
            ph: PhC,
            timestamp,
            pid,
            tid,
            args,
            ..CounterEvent::default()
        }));
    }
}