use facet::Facet;
use crate::{next_scope_id, BacktraceId, PTime, ScopeId};
#[derive(Facet)]
pub struct Scope {
pub id: ScopeId,
pub birth: PTime,
pub backtrace: BacktraceId,
pub name: String,
pub body: ScopeBody,
}
impl Scope {
pub fn new(backtrace: BacktraceId, name: impl Into<String>, body: ScopeBody) -> Scope {
Scope {
id: next_scope_id(),
birth: PTime::now(),
backtrace,
name: name.into(),
body,
}
}
}
#[derive(Facet)]
#[repr(u8)]
#[facet(rename_all = "snake_case")]
pub enum ScopeBody {
Process(ProcessScopeBody),
Thread(ThreadScopeBody),
Task(TaskScopeBody),
Connection(ConnectionScopeBody),
}
#[derive(Facet)]
pub struct ProcessScopeBody {
pub pid: u32,
}
#[derive(Facet)]
pub struct ThreadScopeBody {
pub thread_name: Option<String>,
}
#[derive(Facet)]
pub struct TaskScopeBody {
pub task_key: String,
}
#[derive(Facet)]
pub struct ConnectionScopeBody {
pub local_addr: Option<String>,
pub peer_addr: Option<String>,
}
crate::impl_sqlite_json!(ScopeBody);
crate::declare_scope_body_slots!(
ProcessScopeSlot::Process(ProcessScopeBody),
ThreadScopeSlot::Thread(ThreadScopeBody),
TaskScopeSlot::Task(TaskScopeBody),
ConnectionScopeSlot::Connection(ConnectionScopeBody),
);