Skip to content

Commit ce6113d

Browse files
authored
api: make TraceStateError priviate (#755)
This change simplifies the error handling in the `trace` module by making `TraceStateError` private, and exposing these errors as the more general `TraceError`.
1 parent 2330d43 commit ce6113d

File tree

2 files changed

+33
-20
lines changed

2 files changed

+33
-20
lines changed

opentelemetry-api/src/trace/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ mod tracer_provider;
145145
pub use self::{
146146
context::{get_active_span, mark_span_as_active, FutureExt, SpanRef, TraceContextExt},
147147
span::{Span, SpanKind, StatusCode},
148-
span_context::{SpanContext, SpanId, TraceFlags, TraceId, TraceState, TraceStateError},
148+
span_context::{SpanContext, SpanId, TraceFlags, TraceId, TraceState},
149149
tracer::{SamplingDecision, SamplingResult, SpanBuilder, Tracer},
150150
tracer_provider::TracerProvider,
151151
};

opentelemetry-api/src/trace/span_context.rs

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::trace::{TraceError, TraceResult};
12
use std::collections::VecDeque;
23
use std::fmt;
34
use std::hash::Hash;
@@ -263,15 +264,15 @@ impl TraceState {
263264
/// # Examples
264265
///
265266
/// ```
266-
/// use opentelemetry_api::trace::{TraceState, TraceStateError};
267+
/// use opentelemetry_api::trace::TraceState;
267268
///
268269
/// let kvs = vec![("foo", "bar"), ("apple", "banana")];
269-
/// let trace_state: Result<TraceState, TraceStateError> = TraceState::from_key_value(kvs);
270+
/// let trace_state = TraceState::from_key_value(kvs);
270271
///
271272
/// assert!(trace_state.is_ok());
272273
/// assert_eq!(trace_state.unwrap().header(), String::from("foo=bar,apple=banana"))
273274
/// ```
274-
pub fn from_key_value<T, K, V>(trace_state: T) -> Result<Self, TraceStateError>
275+
pub fn from_key_value<T, K, V>(trace_state: T) -> TraceResult<Self>
275276
where
276277
T: IntoIterator<Item = (K, V)>,
277278
K: ToString,
@@ -282,10 +283,10 @@ impl TraceState {
282283
.map(|(key, value)| {
283284
let (key, value) = (key.to_string(), value.to_string());
284285
if !TraceState::valid_key(key.as_str()) {
285-
return Err(TraceStateError::InvalidKey(key));
286+
return Err(TraceStateError::Key(key));
286287
}
287288
if !TraceState::valid_value(value.as_str()) {
288-
return Err(TraceStateError::InvalidValue(value));
289+
return Err(TraceStateError::Value(value));
289290
}
290291

291292
Ok((key, value))
@@ -318,17 +319,17 @@ impl TraceState {
318319
/// updated key/value is returned.
319320
///
320321
/// [W3 Spec]: https://www.w3.org/TR/trace-context/#mutating-the-tracestate-field
321-
pub fn insert<K, V>(&self, key: K, value: V) -> Result<TraceState, TraceStateError>
322+
pub fn insert<K, V>(&self, key: K, value: V) -> TraceResult<TraceState>
322323
where
323324
K: Into<String>,
324325
V: Into<String>,
325326
{
326327
let (key, value) = (key.into(), value.into());
327328
if !TraceState::valid_key(key.as_str()) {
328-
return Err(TraceStateError::InvalidKey(key));
329+
return Err(TraceStateError::Key(key).into());
329330
}
330331
if !TraceState::valid_value(value.as_str()) {
331-
return Err(TraceStateError::InvalidValue(value));
332+
return Err(TraceStateError::Value(value).into());
332333
}
333334

334335
let mut trace_state = self.delete_from_deque(key.clone());
@@ -346,10 +347,10 @@ impl TraceState {
346347
/// If the key is not in `TraceState`. The original `TraceState` will be cloned and returned.
347348
///
348349
/// [W3 Spec]: https://www.w3.org/TR/trace-context/#mutating-the-tracestate-field
349-
pub fn delete<K: Into<String>>(&self, key: K) -> Result<TraceState, TraceStateError> {
350+
pub fn delete<K: Into<String>>(&self, key: K) -> TraceResult<TraceState> {
350351
let key = key.into();
351352
if !TraceState::valid_key(key.as_str()) {
352-
return Err(TraceStateError::InvalidKey(key));
353+
return Err(TraceStateError::Key(key).into());
353354
}
354355

355356
Ok(self.delete_from_deque(key))
@@ -387,15 +388,15 @@ impl TraceState {
387388
}
388389

389390
impl FromStr for TraceState {
390-
type Err = TraceStateError;
391+
type Err = TraceError;
391392

392393
fn from_str(s: &str) -> Result<Self, Self::Err> {
393394
let list_members: Vec<&str> = s.split_terminator(',').collect();
394395
let mut key_value_pairs: Vec<(String, String)> = Vec::with_capacity(list_members.len());
395396

396397
for list_member in list_members {
397398
match list_member.find('=') {
398-
None => return Err(TraceStateError::InvalidList(list_member.to_string())),
399+
None => return Err(TraceStateError::List(list_member.to_string()).into()),
399400
Some(separator_index) => {
400401
let (key, value) = list_member.split_at(separator_index);
401402
key_value_pairs
@@ -411,18 +412,30 @@ impl FromStr for TraceState {
411412
/// Error returned by `TraceState` operations.
412413
#[derive(Error, Debug)]
413414
#[non_exhaustive]
414-
pub enum TraceStateError {
415-
/// The key is invalid. See <https://www.w3.org/TR/trace-context/#key> for requirement for keys.
415+
enum TraceStateError {
416+
/// The key is invalid.
417+
///
418+
/// See <https://www.w3.org/TR/trace-context/#key> for requirement for keys.
416419
#[error("{0} is not a valid key in TraceState, see https://www.w3.org/TR/trace-context/#key for more details")]
417-
InvalidKey(String),
420+
Key(String),
418421

419-
/// The value is invalid. See <https://www.w3.org/TR/trace-context/#value> for requirement for values.
422+
/// The value is invalid.
423+
///
424+
/// See <https://www.w3.org/TR/trace-context/#value> for requirement for values.
420425
#[error("{0} is not a valid value in TraceState, see https://www.w3.org/TR/trace-context/#value for more details")]
421-
InvalidValue(String),
426+
Value(String),
422427

423-
/// The value is invalid. See <https://www.w3.org/TR/trace-context/#list> for requirement for list members.
428+
/// The list is invalid.
429+
///
430+
/// See <https://www.w3.org/TR/trace-context/#list> for requirement for list members.
424431
#[error("{0} is not a valid list member in TraceState, see https://www.w3.org/TR/trace-context/#list for more details")]
425-
InvalidList(String),
432+
List(String),
433+
}
434+
435+
impl From<TraceStateError> for TraceError {
436+
fn from(err: TraceStateError) -> Self {
437+
TraceError::Other(Box::new(err))
438+
}
426439
}
427440

428441
/// Immutable portion of a [`Span`] which can be serialized and propagated.

0 commit comments

Comments
 (0)