use crate::{
metrics::{sdk_api, Number},
KeyValue,
};
use std::marker;
use std::sync::Arc;
#[derive(Debug)]
pub struct Measurement {
number: Number,
instrument: Arc<dyn sdk_api::SyncInstrumentCore>,
}
impl Measurement {
pub(crate) fn new(number: Number, instrument: Arc<dyn sdk_api::SyncInstrumentCore>) -> Self {
Measurement { number, instrument }
}
pub fn number(&self) -> &Number {
&self.number
}
pub fn into_number(self) -> Number {
self.number
}
pub fn instrument(&self) -> &Arc<dyn sdk_api::SyncInstrumentCore> {
&self.instrument
}
}
#[derive(Clone, Debug)]
pub(crate) struct SyncInstrument<T> {
instrument: Arc<dyn sdk_api::SyncInstrumentCore>,
_marker: marker::PhantomData<T>,
}
impl<T> SyncInstrument<T> {
pub(crate) fn new(instrument: Arc<dyn sdk_api::SyncInstrumentCore>) -> Self {
SyncInstrument {
instrument,
_marker: marker::PhantomData,
}
}
pub(crate) fn bind(&self, attributes: &[KeyValue]) -> SyncBoundInstrument<T> {
let bound_instrument = self.instrument.bind(attributes);
SyncBoundInstrument {
bound_instrument,
_marker: marker::PhantomData,
}
}
pub(crate) fn direct_record(&self, number: Number, attributes: &[KeyValue]) {
self.instrument.record_one(number, attributes)
}
pub(crate) fn instrument(&self) -> &Arc<dyn sdk_api::SyncInstrumentCore> {
&self.instrument
}
}
#[derive(Clone, Debug)]
pub(crate) struct SyncBoundInstrument<T> {
bound_instrument: Arc<dyn sdk_api::SyncBoundInstrumentCore>,
_marker: marker::PhantomData<T>,
}
impl<T> SyncBoundInstrument<T> {
pub(crate) fn direct_record(&self, number: Number) {
self.bound_instrument.record_one(number)
}
}