| 1 | pub(crate) use spanned::*; |
| 2 | |
| 3 | /// An optional spanned value. |
| 4 | #[derive (Debug, Clone)] |
| 5 | pub struct OptWithLine<T>(Option<Spanned<T>>); |
| 6 | |
| 7 | impl<T> std::ops::Deref for OptWithLine<T> { |
| 8 | type Target = Option<Spanned<T>>; |
| 9 | |
| 10 | fn deref(&self) -> &Self::Target { |
| 11 | &self.0 |
| 12 | } |
| 13 | } |
| 14 | |
| 15 | impl<T> From<Option<Spanned<T>>> for OptWithLine<T> { |
| 16 | fn from(value: Option<Spanned<T>>) -> Self { |
| 17 | Self(value) |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | impl<T> From<Spanned<T>> for OptWithLine<T> { |
| 22 | fn from(value: Spanned<T>) -> Self { |
| 23 | Self(Some(value)) |
| 24 | } |
| 25 | } |
| 26 | |
| 27 | impl<T> Default for OptWithLine<T> { |
| 28 | fn default() -> Self { |
| 29 | Self(Default::default()) |
| 30 | } |
| 31 | } |
| 32 | |
| 33 | impl<T> OptWithLine<T> { |
| 34 | /// Creates a new optional spanned value. |
| 35 | pub fn new(data: T, span: Span) -> Self { |
| 36 | Self(Some(Spanned::new(data, span))) |
| 37 | } |
| 38 | |
| 39 | /// Tries to set the value if not already set. Returns newly passed |
| 40 | /// value in case there was already a value there. |
| 41 | #[must_use ] |
| 42 | pub fn set(&mut self, data: T, span: Span) -> Option<Spanned<T>> { |
| 43 | let new = Spanned::new(data, span); |
| 44 | if self.0.is_some() { |
| 45 | Some(new) |
| 46 | } else { |
| 47 | self.0 = Some(new); |
| 48 | None |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | /// Consumes `self` and returns the inner value. |
| 53 | #[must_use ] |
| 54 | pub fn into_inner(self) -> Option<Spanned<T>> { |
| 55 | self.0 |
| 56 | } |
| 57 | } |
| 58 | |