aboutsummaryrefslogtreecommitdiff
path: root/src/spanned.rs
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2018-05-05 14:41:57 -0700
committerJohn-John Tedro <udoprog@tedro.se>2018-05-06 11:06:00 +0200
commitfd87ce35d563ecdac1f909d4540328365a16661f (patch)
tree478ed25805ea93baf5d3c383541809c2466ab188 /src/spanned.rs
parent44bec613697e884df64634536554c611d3135b3b (diff)
downloadmilf-rs-fd87ce35d563ecdac1f909d4540328365a16661f.tar.gz
milf-rs-fd87ce35d563ecdac1f909d4540328365a16661f.zip
Proof of concept: reporting span information to a Spanned<T> type
Diffstat (limited to 'src/spanned.rs')
-rw-r--r--src/spanned.rs49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/spanned.rs b/src/spanned.rs
new file mode 100644
index 0000000..04ec9b8
--- /dev/null
+++ b/src/spanned.rs
@@ -0,0 +1,49 @@
+//! ```
+//! #[macro_use]
+//! extern crate serde_derive;
+//!
+//! extern crate toml;
+//! use toml::spanned::Spanned;
+//!
+//! #[derive(Deserialize)]
+//! struct Udoprog {
+//! s: Spanned<String>,
+//! }
+//!
+//! fn main() {
+//! let t = "s = \"udoprog\"\n";
+//!
+//! let u: Udoprog = toml::from_str(t).unwrap();
+//!
+//! assert_eq!(u.s.start, 4);
+//! assert_eq!(u.s.end, 13);
+//! }
+//! ```
+
+use serde::{Serialize, Serializer};
+
+// FIXME: use a more unique name like "toml::Spanned".
+#[doc(hidden)]
+pub const NAME: &str = "Spanned";
+#[doc(hidden)]
+pub const FIELDS: &[&str] = &["value", "start", "end"];
+
+///
+#[derive(Deserialize, Debug)]
+pub struct Spanned<T> {
+ ///
+ pub value: T,
+ ///
+ pub start: usize,
+ ///
+ pub end: usize,
+}
+
+impl<T: Serialize> Serialize for Spanned<T> {
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+ where
+ S: Serializer,
+ {
+ self.value.serialize(serializer)
+ }
+}