From 1b6a04ca5504955c571d1c97504fb45ea0befee4 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Mon, 8 Jan 2024 01:21:28 +0400 Subject: Initial vendor packages Signed-off-by: Valentin Popov --- vendor/miette/src/named_source.rs | 61 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 vendor/miette/src/named_source.rs (limited to 'vendor/miette/src/named_source.rs') diff --git a/vendor/miette/src/named_source.rs b/vendor/miette/src/named_source.rs new file mode 100644 index 0000000..31ad1d1 --- /dev/null +++ b/vendor/miette/src/named_source.rs @@ -0,0 +1,61 @@ +use crate::{MietteError, MietteSpanContents, SourceCode, SpanContents}; + +/// Utility struct for when you have a regular [`SourceCode`] type that doesn't +/// implement `name`. For example [`String`]. Or if you want to override the +/// `name` returned by the `SourceCode`. +pub struct NamedSource { + source: Box, + name: String, +} + +impl std::fmt::Debug for NamedSource { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("NamedSource") + .field("name", &self.name) + .field("source", &""); + Ok(()) + } +} + +impl NamedSource { + /// Create a new `NamedSource` using a regular [`SourceCode`] and giving + /// its returned [`SpanContents`] a name. + pub fn new(name: impl AsRef, source: impl SourceCode + Send + Sync + 'static) -> Self { + Self { + source: Box::new(source), + name: name.as_ref().to_string(), + } + } + + /// Gets the name of this `NamedSource`. + pub fn name(&self) -> &str { + &self.name + } + + /// Returns a reference the inner [`SourceCode`] type for this + /// `NamedSource`. + pub fn inner(&self) -> &(dyn SourceCode + 'static) { + &*self.source + } +} + +impl SourceCode for NamedSource { + fn read_span<'a>( + &'a self, + span: &crate::SourceSpan, + context_lines_before: usize, + context_lines_after: usize, + ) -> Result + 'a>, MietteError> { + let contents = self + .inner() + .read_span(span, context_lines_before, context_lines_after)?; + Ok(Box::new(MietteSpanContents::new_named( + self.name.clone(), + contents.data(), + *contents.span(), + contents.line(), + contents.column(), + contents.line_count(), + ))) + } +} -- cgit v1.2.3