| 1 | use serde::{de, ser}; | 
| 2 | use std::borrow::Borrow; | 
|---|
| 3 | use std::cmp::Ordering; | 
|---|
| 4 | use std::fmt; | 
|---|
| 5 | use std::hash::{Hash, Hasher}; | 
|---|
| 6 |  | 
|---|
| 7 | pub(crate) const NAME: &str = "$__toml_private_Spanned"; | 
|---|
| 8 | pub(crate) const START: &str = "$__toml_private_start"; | 
|---|
| 9 | pub(crate) const END: &str = "$__toml_private_end"; | 
|---|
| 10 | pub(crate) const VALUE: &str = "$__toml_private_value"; | 
|---|
| 11 |  | 
|---|
| 12 | /// A spanned value, indicating the range at which it is defined in the source. | 
|---|
| 13 | /// | 
|---|
| 14 | /// ``` | 
|---|
| 15 | /// use serde_derive::Deserialize; | 
|---|
| 16 | /// use toml::Spanned; | 
|---|
| 17 | /// | 
|---|
| 18 | /// #[derive(Deserialize)] | 
|---|
| 19 | /// struct Value { | 
|---|
| 20 | ///     s: Spanned<String>, | 
|---|
| 21 | /// } | 
|---|
| 22 | /// | 
|---|
| 23 | /// let t = "s = \" value\"\n "; | 
|---|
| 24 | /// | 
|---|
| 25 | /// let u: Value = toml::from_str(t).unwrap(); | 
|---|
| 26 | /// | 
|---|
| 27 | /// assert_eq!(u.s.start(), 4); | 
|---|
| 28 | /// assert_eq!(u.s.end(), 11); | 
|---|
| 29 | /// assert_eq!(u.s.get_ref(), "value"); | 
|---|
| 30 | /// assert_eq!(u.s.into_inner(), String::from( "value")); | 
|---|
| 31 | /// ``` | 
|---|
| 32 | #[ derive(Clone, Debug)] | 
|---|
| 33 | pub struct Spanned<T> { | 
|---|
| 34 | /// The start range. | 
|---|
| 35 | start: usize, | 
|---|
| 36 | /// The end range (exclusive). | 
|---|
| 37 | end: usize, | 
|---|
| 38 | /// The spanned value. | 
|---|
| 39 | value: T, | 
|---|
| 40 | } | 
|---|
| 41 |  | 
|---|
| 42 | impl<T> Spanned<T> { | 
|---|
| 43 | /// Access the start of the span of the contained value. | 
|---|
| 44 | pub fn start(&self) -> usize { | 
|---|
| 45 | self.start | 
|---|
| 46 | } | 
|---|
| 47 |  | 
|---|
| 48 | /// Access the end of the span of the contained value. | 
|---|
| 49 | pub fn end(&self) -> usize { | 
|---|
| 50 | self.end | 
|---|
| 51 | } | 
|---|
| 52 |  | 
|---|
| 53 | /// Get the span of the contained value. | 
|---|
| 54 | pub fn span(&self) -> (usize, usize) { | 
|---|
| 55 | (self.start, self.end) | 
|---|
| 56 | } | 
|---|
| 57 |  | 
|---|
| 58 | /// Consumes the spanned value and returns the contained value. | 
|---|
| 59 | pub fn into_inner(self) -> T { | 
|---|
| 60 | self.value | 
|---|
| 61 | } | 
|---|
| 62 |  | 
|---|
| 63 | /// Returns a reference to the contained value. | 
|---|
| 64 | pub fn get_ref(&self) -> &T { | 
|---|
| 65 | &self.value | 
|---|
| 66 | } | 
|---|
| 67 |  | 
|---|
| 68 | /// Returns a mutable reference to the contained value. | 
|---|
| 69 | pub fn get_mut(&mut self) -> &mut T { | 
|---|
| 70 | &mut self.value | 
|---|
| 71 | } | 
|---|
| 72 | } | 
|---|
| 73 |  | 
|---|
| 74 | impl Borrow<str> for Spanned<String> { | 
|---|
| 75 | fn borrow(&self) -> &str { | 
|---|
| 76 | self.get_ref() | 
|---|
| 77 | } | 
|---|
| 78 | } | 
|---|
| 79 |  | 
|---|
| 80 | impl<T: PartialEq> PartialEq for Spanned<T> { | 
|---|
| 81 | fn eq(&self, other: &Self) -> bool { | 
|---|
| 82 | self.value.eq(&other.value) | 
|---|
| 83 | } | 
|---|
| 84 | } | 
|---|
| 85 |  | 
|---|
| 86 | impl<T: Eq> Eq for Spanned<T> {} | 
|---|
| 87 |  | 
|---|
| 88 | impl<T: Hash> Hash for Spanned<T> { | 
|---|
| 89 | fn hash<H: Hasher>(&self, state: &mut H) { | 
|---|
| 90 | self.value.hash(state); | 
|---|
| 91 | } | 
|---|
| 92 | } | 
|---|
| 93 |  | 
|---|
| 94 | impl<T: PartialOrd> PartialOrd for Spanned<T> { | 
|---|
| 95 | fn partial_cmp(&self, other: &Self) -> Option<Ordering> { | 
|---|
| 96 | self.value.partial_cmp(&other.value) | 
|---|
| 97 | } | 
|---|
| 98 | } | 
|---|
| 99 |  | 
|---|
| 100 | impl<T: Ord> Ord for Spanned<T> { | 
|---|
| 101 | fn cmp(&self, other: &Self) -> Ordering { | 
|---|
| 102 | self.value.cmp(&other.value) | 
|---|
| 103 | } | 
|---|
| 104 | } | 
|---|
| 105 |  | 
|---|
| 106 | impl<'de, T> de::Deserialize<'de> for Spanned<T> | 
|---|
| 107 | where | 
|---|
| 108 | T: de::Deserialize<'de>, | 
|---|
| 109 | { | 
|---|
| 110 | fn deserialize<D>(deserializer: D) -> Result<Spanned<T>, D::Error> | 
|---|
| 111 | where | 
|---|
| 112 | D: de::Deserializer<'de>, | 
|---|
| 113 | { | 
|---|
| 114 | struct SpannedVisitor<T>(::std::marker::PhantomData<T>); | 
|---|
| 115 |  | 
|---|
| 116 | impl<'de, T> de::Visitor<'de> for SpannedVisitor<T> | 
|---|
| 117 | where | 
|---|
| 118 | T: de::Deserialize<'de>, | 
|---|
| 119 | { | 
|---|
| 120 | type Value = Spanned<T>; | 
|---|
| 121 |  | 
|---|
| 122 | fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { | 
|---|
| 123 | formatter.write_str( "a TOML spanned") | 
|---|
| 124 | } | 
|---|
| 125 |  | 
|---|
| 126 | fn visit_map<V>(self, mut visitor: V) -> Result<Spanned<T>, V::Error> | 
|---|
| 127 | where | 
|---|
| 128 | V: de::MapAccess<'de>, | 
|---|
| 129 | { | 
|---|
| 130 | if visitor.next_key()? != Some(START) { | 
|---|
| 131 | return Err(de::Error::custom( "spanned start key not found")); | 
|---|
| 132 | } | 
|---|
| 133 |  | 
|---|
| 134 | let start: usize = visitor.next_value()?; | 
|---|
| 135 |  | 
|---|
| 136 | if visitor.next_key()? != Some(END) { | 
|---|
| 137 | return Err(de::Error::custom( "spanned end key not found")); | 
|---|
| 138 | } | 
|---|
| 139 |  | 
|---|
| 140 | let end: usize = visitor.next_value()?; | 
|---|
| 141 |  | 
|---|
| 142 | if visitor.next_key()? != Some(VALUE) { | 
|---|
| 143 | return Err(de::Error::custom( "spanned value key not found")); | 
|---|
| 144 | } | 
|---|
| 145 |  | 
|---|
| 146 | let value: T = visitor.next_value()?; | 
|---|
| 147 |  | 
|---|
| 148 | Ok(Spanned { start, end, value }) | 
|---|
| 149 | } | 
|---|
| 150 | } | 
|---|
| 151 |  | 
|---|
| 152 | let visitor = SpannedVisitor(::std::marker::PhantomData); | 
|---|
| 153 |  | 
|---|
| 154 | static FIELDS: [&str; 3] = [START, END, VALUE]; | 
|---|
| 155 | deserializer.deserialize_struct(NAME, &FIELDS, visitor) | 
|---|
| 156 | } | 
|---|
| 157 | } | 
|---|
| 158 |  | 
|---|
| 159 | impl<T: ser::Serialize> ser::Serialize for Spanned<T> { | 
|---|
| 160 | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> | 
|---|
| 161 | where | 
|---|
| 162 | S: ser::Serializer, | 
|---|
| 163 | { | 
|---|
| 164 | self.value.serialize(serializer) | 
|---|
| 165 | } | 
|---|
| 166 | } | 
|---|
| 167 |  | 
|---|