aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib.rs2
-rw-r--r--src/spanned.rs46
-rw-r--r--test-suite/tests/spanned.rs6
3 files changed, 44 insertions, 10 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 6fbf5d5..2f038e8 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -170,6 +170,6 @@ mod tokens;
#[doc(hidden)]
pub mod macros;
-pub mod spanned;
+mod spanned;
#[doc(no_inline)]
pub use spanned::Spanned;
diff --git a/src/spanned.rs b/src/spanned.rs
index 8fbc529..abbbd49 100644
--- a/src/spanned.rs
+++ b/src/spanned.rs
@@ -3,7 +3,7 @@
//! extern crate serde_derive;
//!
//! extern crate toml;
-//! use toml::spanned::Spanned;
+//! use toml::Spanned;
//!
//! #[derive(Deserialize)]
//! struct Value {
@@ -15,8 +15,10 @@
//!
//! let u: Value = toml::from_str(t).unwrap();
//!
-//! assert_eq!(u.s.start, 4);
-//! assert_eq!(u.s.end, 11);
+//! assert_eq!(u.s.start(), 4);
+//! assert_eq!(u.s.end(), 11);
+//! assert_eq!(u.s.get_ref(), "value");
+//! assert_eq!(u.s.into_inner(), String::from("value"));
//! }
//! ```
@@ -36,11 +38,43 @@ pub const VALUE: &'static str = "$__toml_private_value";
#[derive(Debug)]
pub struct Spanned<T> {
/// The start range.
- pub start: usize,
+ start: usize,
/// The end range (exclusive).
- pub end: usize,
+ end: usize,
/// The spanned value.
- pub value: T,
+ value: T,
+}
+
+impl<T> Spanned<T> {
+ /// Access the start of the span of the contained value.
+ pub fn start(&self) -> usize {
+ self.start
+ }
+
+ /// Access the end of the span of the contained value.
+ pub fn end(&self) -> usize {
+ self.end
+ }
+
+ /// Get the span of the contained value.
+ pub fn span(&self) -> (usize, usize) {
+ (self.start, self.end)
+ }
+
+ /// Consumes the spanned value and returns the contained value.
+ pub fn into_inner(self) -> T {
+ self.value
+ }
+
+ /// Returns a reference to the contained value.
+ pub fn get_ref(&self) -> &T {
+ &self.value
+ }
+
+ /// Returns a mutable reference to the contained value.
+ pub fn get_mut(&self) -> &T {
+ &self.value
+ }
}
impl<'de, T> de::Deserialize<'de> for Spanned<T>
diff --git a/test-suite/tests/spanned.rs b/test-suite/tests/spanned.rs
index 4339a0c..1b110f0 100644
--- a/test-suite/tests/spanned.rs
+++ b/test-suite/tests/spanned.rs
@@ -34,9 +34,9 @@ fn test_spanned_field() {
fn good<'de, T>(s: &'de str, expected: &str) where T: serde::Deserialize<'de> {
let foo: Foo<T> = toml::from_str(s).unwrap();
- assert_eq!(6, foo.foo.start);
- assert_eq!(s.len(), foo.foo.end);
- assert_eq!(expected, &s[foo.foo.start..foo.foo.end]);
+ assert_eq!(6, foo.foo.start());
+ assert_eq!(s.len(), foo.foo.end());
+ assert_eq!(expected, &s[foo.foo.start()..foo.foo.end()]);
}
good::<String>("foo = \"foo\"", "\"foo\"");