From 7a3b008c06448358662396e03ee74059002195dc Mon Sep 17 00:00:00 2001 From: Kyle Date: Wed, 8 Feb 2023 19:15:27 -0800 Subject: [PATCH] SourceCode provides access to bytes --- src/named_source.rs | 4 ++++ src/protocol.rs | 9 +++++++++ src/source_impls.rs | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/src/named_source.rs b/src/named_source.rs index e6581bf..85a5b27 100644 --- a/src/named_source.rs +++ b/src/named_source.rs @@ -53,4 +53,8 @@ impl SourceCode for NamedSource { contents.line_count(), ))) } + + fn source_bytes(&self) -> &[u8] { + self.inner().source_bytes() + } } diff --git a/src/protocol.rs b/src/protocol.rs index 5b657b4..8d0c032 100644 --- a/src/protocol.rs +++ b/src/protocol.rs @@ -192,6 +192,15 @@ pub trait SourceCode: Send + Sync { context_lines_before: usize, context_lines_after: usize, ) -> Result + 'a>, MietteError>; + + /// Borrow the source bytes in their entirety. + fn source_bytes(&self) -> &[u8]; + + /// Borrow the source bytes as a string slice. + /// Returns None if the source is not a valid utf-8 string. + fn source_utf8(&self) -> Result<&str, std::str::Utf8Error> { + std::str::from_utf8(self.source_bytes()) + } } /// A labeled [`SourceSpan`]. diff --git a/src/source_impls.rs b/src/source_impls.rs index 52187cb..12ceedf 100644 --- a/src/source_impls.rs +++ b/src/source_impls.rs @@ -106,6 +106,10 @@ impl SourceCode for [u8] { let contents = context_info(self, span, context_lines_before, context_lines_after)?; Ok(Box::new(contents)) } + + fn source_bytes(&self) -> &[u8] { + &self[..] + } } impl<'src> SourceCode for &'src [u8] { @@ -117,6 +121,12 @@ impl<'src> SourceCode for &'src [u8] { ) -> Result + 'a>, MietteError> { <[u8] as SourceCode>::read_span(self, span, context_lines_before, context_lines_after) } + + fn source_bytes(&self) -> &[u8] { + self + } + + } impl SourceCode for Vec { @@ -128,6 +138,10 @@ impl SourceCode for Vec { ) -> Result + 'a>, MietteError> { <[u8] as SourceCode>::read_span(self, span, context_lines_before, context_lines_after) } + + fn source_bytes(&self) -> &[u8] { + self.as_slice() + } } impl SourceCode for str { @@ -144,6 +158,10 @@ impl SourceCode for str { context_lines_after, ) } + + fn source_bytes(&self) -> &[u8] { + self.as_bytes() + } } /// Makes `src: &'static str` or `struct S<'a> { src: &'a str }` usable. @@ -156,6 +174,10 @@ impl<'s> SourceCode for &'s str { ) -> Result + 'a>, MietteError> { ::read_span(self, span, context_lines_before, context_lines_after) } + + fn source_bytes(&self) -> &[u8] { + self.as_bytes() + } } impl SourceCode for String { @@ -167,6 +189,10 @@ impl SourceCode for String { ) -> Result + 'a>, MietteError> { ::read_span(self, span, context_lines_before, context_lines_after) } + + fn source_bytes(&self) -> &[u8] { + self.as_bytes() + } } impl SourceCode for Arc { @@ -179,6 +205,10 @@ impl SourceCode for Arc { self.as_ref() .read_span(span, context_lines_before, context_lines_after) } + + fn source_bytes(&self) -> &[u8] { + self.as_ref().source_bytes() + } } impl SourceCode for Cow<'_, T> @@ -199,6 +229,10 @@ where self.as_ref() .read_span(span, context_lines_before, context_lines_after) } + + fn source_bytes(&self) -> &[u8] { + self.as_ref().source_bytes() + } } #[cfg(test)]