1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use crate::{stack::with_top, EncodedSpanWrap, SpanWrap};
use crossbeam_channel as cb;
use serde::{de::DeserializeOwned, Serialize};
#[derive(Clone, Shrinkwrap)]
pub struct SpanSender<T>(cb::Sender<SpanWrap<T>>);
#[derive(Clone, Shrinkwrap)]
pub struct EncodedSpanSender<T: Serialize + DeserializeOwned + Clone>(
cb::Sender<EncodedSpanWrap<T>>,
);
impl<T> From<cb::Sender<SpanWrap<T>>> for SpanSender<T> {
fn from(tx: cb::Sender<SpanWrap<T>>) -> SpanSender<T> {
SpanSender(tx)
}
}
impl<T: Send + DeserializeOwned + Serialize + Clone> From<cb::Sender<EncodedSpanWrap<T>>>
for EncodedSpanSender<T>
{
fn from(tx: cb::Sender<EncodedSpanWrap<T>>) -> EncodedSpanSender<T> {
EncodedSpanSender(tx)
}
}
impl<T: Send + std::fmt::Debug> SpanSender<T> {
pub fn send_wrapped(&self, v: T) -> Result<(), cb::SendError<SpanWrap<T>>> {
let context = with_top(|top| {
top.event(format!("SpanSender::send_wrapped: {:?}", v));
top.context()
})
.flatten();
self.0.send(SpanWrap::new(v, context))
}
}
impl<T: Send + std::fmt::Debug + DeserializeOwned + Serialize + Clone> EncodedSpanSender<T> {
pub fn send_wrapped(&self, v: T) -> Result<(), cb::SendError<EncodedSpanWrap<T>>> {
let context = with_top(|top| {
top.event(format!("EncodedSpanSender::send_wrapped: {:?}", v));
top.context()
})
.flatten();
self.0.send(SpanWrap::new(v, context).into())
}
}
pub type SpanReceiver<T> = cb::Receiver<SpanWrap<T>>;
pub type EncodedSpanReceiver<T> = cb::Receiver<EncodedSpanWrap<T>>;
pub fn lax_send_wrapped<T: Send + std::fmt::Debug>(
tx: SpanSender<T>,
val: T,
_failure_reason: &str,
) -> bool {
match tx.send_wrapped(val) {
Ok(()) => true,
Err(_) => {
false
}
}
}