apple-quant-core 0.2.0

Apple Quant's core library.
Documentation
use tracing::{
	field::{Field, Visit},
	Subscriber,
};

use tracing_subscriber::{layer::Context, registry::LookupSpan};

use super::Chain;

pub(crate) struct SimpleEventVisitor<'a, S>
where
	S: Subscriber + for<'l> LookupSpan<'l>,
{
	pub(crate) tracing_context: &'a Context<'a, S>,
	pub(crate) message: Option<String>,
	pub(crate) chain: Chain,
}

impl<'a, S> SimpleEventVisitor<'a, S>
where
	S: Subscriber + for<'l> LookupSpan<'l>,
{
	pub(crate) fn new(
		tracing_context: &'a Context<'a, S>,
	) -> Self {
		Self {
			tracing_context,
			message: None,
			chain: Chain::default(),
		}
	}
}

impl<'a, S> Visit for SimpleEventVisitor<'a, S>
where
	S: Subscriber + for<'l> LookupSpan<'l>,
{
	fn record_str(
		&mut self,
		field: &Field,
		value: &str,
	) {
		let name = field.name();
		let value = value.to_owned();

		if name == "message" {
			self.message = Some(value);
		}
	}

	fn record_debug(
		&mut self,
		field: &Field,
		value: &dyn std::fmt::Debug,
	) {
		let name = field.name();

		if name == "message" {
			self.message = Some(format!("{:?}", value));
		}
	}

	fn record_error(
		&mut self,
		_field: &Field,
		value: &(dyn std::error::Error + 'static),
	) {
		self.chain = Chain::new(self.tracing_context, value);
	}
}