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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
use std::collections::{HashMap, BTreeMap};
use std::io::{Read, Write};
use Result;
use span::SpanContext;
pub trait InjectToTextMap<T>: Sized
where
T: TextMap,
{
fn inject_to_text_map(context: &SpanContext<Self>, carrier: &mut T) -> Result<()>;
}
pub trait ExtractFromTextMap<T>: Sized
where
T: TextMap,
{
fn extract_from_text_map(carrier: &T) -> Result<Option<SpanContext<Self>>>;
}
pub trait TextMap {
fn set(&mut self, key: &str, value: &str);
fn get(&self, key: &str) -> Option<&str>;
}
impl TextMap for HashMap<String, String> {
fn set(&mut self, key: &str, value: &str) {
self.insert(key.to_owned(), value.to_owned());
}
fn get(&self, key: &str) -> Option<&str> {
self.get(key).map(|v| v.as_ref())
}
}
impl TextMap for BTreeMap<String, String> {
fn set(&mut self, key: &str, value: &str) {
self.insert(key.to_owned(), value.to_owned());
}
fn get(&self, key: &str) -> Option<&str> {
self.get(key).map(|v| v.as_ref())
}
}
pub trait InjectToHttpHeader<T>: Sized
where
T: SetHttpHeaderField,
{
fn inject_to_http_header(context: &SpanContext<Self>, carrier: &mut T) -> Result<()>;
}
pub trait ExtractFromHttpHeader<'a, T>: Sized
where
T: IterHttpHeaderFields<'a>,
{
fn extract_from_http_header(carrier: &'a T) -> Result<Option<SpanContext<Self>>>;
}
pub trait SetHttpHeaderField {
fn set_http_header_field(&mut self, name: &str, value: &str) -> Result<()>;
}
pub trait IterHttpHeaderFields<'a> {
type Fields: Iterator<Item = (&'a str, &'a [u8])>;
fn fields(&'a self) -> Self::Fields;
}
pub trait InjectToBinary<T>: Sized
where
T: Write,
{
fn inject_to_binary(context: &SpanContext<Self>, carrier: &mut T) -> Result<()>;
}
pub trait ExtractFromBinary<T>: Sized
where
T: Read,
{
fn extract_from_binary(carrier: &mut T) -> Result<Option<SpanContext<Self>>>;
}