brk_rolldown_debug 0.1.0

brk fork of rolldown_debug
Documentation
use std::str::FromStr;
use std::sync::Arc;
use std::sync::atomic::AtomicBool;

use tracing_subscriber::EnvFilter;
use tracing_subscriber::fmt;
use tracing_subscriber::prelude::*;

use crate::debug_data_propagate_layer::DebugDataPropagateLayer;
use crate::debug_formatter::DebugFormatter;
use crate::static_data::EXIST_HASH_BY_SESSION;
use crate::static_data::OPENED_FILE_HANDLES;
use crate::static_data::OPENED_FILES_BY_SESSION;

static IS_INITIALIZED: AtomicBool = AtomicBool::new(false);

static FILTER_FOR_DEVTOOL: &str = "[{meta}]=trace";

pub fn init_devtool_tracing() {
  if IS_INITIALIZED.swap(true, std::sync::atomic::Ordering::SeqCst) {
    return;
  }

  let env_filter = EnvFilter::from_str(FILTER_FOR_DEVTOOL).unwrap();
  tracing_subscriber::registry()
    .with(env_filter)
    .with(DebugDataPropagateLayer)
    .with(fmt::layer().event_format(DebugFormatter))
    .init();
}

#[derive(Debug, Clone)]
pub struct DebugTracer {
  session_id: Arc<str>,
}

impl DebugTracer {
  #[must_use]
  pub fn init(session_id: Arc<str>) -> Self {
    let tracer = Self { session_id };
    if IS_INITIALIZED.swap(true, std::sync::atomic::Ordering::SeqCst) {
      return tracer;
    }

    let env_filter = EnvFilter::from_str(FILTER_FOR_DEVTOOL).unwrap();
    tracing_subscriber::registry()
      .with(env_filter)
      .with(DebugDataPropagateLayer)
      .with(fmt::layer().event_format(DebugFormatter))
      .init();

    tracer
  }
}

impl Drop for DebugTracer {
  fn drop(&mut self) {
    if let Some((_session_id, files)) = OPENED_FILES_BY_SESSION.remove(self.session_id.as_ref()) {
      for file in files {
        OPENED_FILE_HANDLES.remove(&file);
      }
    }
    EXIST_HASH_BY_SESSION.remove(self.session_id.as_ref());
  }
}

#[derive(Debug, Clone)]

pub struct Session {
  pub id: Arc<str>,
  pub span: tracing::Span,
}

impl Session {
  pub fn new(id: Arc<str>, span: tracing::Span) -> Self {
    Self { id, span }
  }

  pub fn dummy() -> Self {
    let session_id = Arc::from("unknown_session");
    Self { id: session_id, span: tracing::Span::none() }
  }
}