use proc_macro2::Span;
use std::ops::Deref;
use syn::parse::{Parse, ParseStream, Result as ParseResult};
pub trait ParseInner: Sized {
fn spanned_parse(input: ParseStream) -> ParseResult<(Span, Self)>;
}
impl<T: Parse> ParseInner for T {
fn spanned_parse(input: ParseStream) -> ParseResult<(Span, Self)> {
Ok((input.span(), T::parse(input)?))
}
}
impl<T: ParseInner> Parse for Spanned<T> {
fn parse(input: ParseStream) -> ParseResult<Self> {
let (span, value) = T::spanned_parse(input)?;
Ok(Spanned(span, value))
}
}
#[cfg_attr(test, derive(Clone, Debug))]
pub struct Spanned<T>(Span, T);
impl<T> Spanned<T> {
pub fn span(&self) -> Span {
self.0
}
pub fn into_inner(self) -> T {
self.1
}
}
impl<T> Deref for Spanned<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.1
}
}