expose error kind

This commit is contained in:
Connor Skees 2022-09-03 19:23:07 -04:00
parent d349591926
commit 95230c0df9
3 changed files with 38 additions and 13 deletions

View File

@ -207,11 +207,6 @@ impl CallArgs {
self.get_positional(position) self.get_positional(position)
} }
#[allow(dead_code, clippy::unused_self)]
fn named_arg(&mut self, name: &'static str) -> Option<SassResult<Spanned<Value>>> {
self.get_named(name)
}
pub fn default_named_arg(&mut self, name: &'static str, default: Value) -> SassResult<Value> { pub fn default_named_arg(&mut self, name: &'static str, default: Value) -> SassResult<Value> {
Ok(match self.get_named(name) { Ok(match self.get_named(name) {
Some(val) => val?.node, Some(val) => val?.node,

View File

@ -2,8 +2,8 @@ use std::{
error::Error, error::Error,
fmt::{self, Display}, fmt::{self, Display},
io, io,
rc::Rc,
string::FromUtf8Error, string::FromUtf8Error,
sync::Arc,
}; };
use codemap::{Span, SpanLoc}; use codemap::{Span, SpanLoc};
@ -37,6 +37,24 @@ pub struct SassError {
} }
impl SassError { impl SassError {
#[must_use]
pub fn kind(self) -> PublicSassErrorKind {
match self.kind {
SassErrorKind::ParseError {
message,
loc,
unicode,
} => PublicSassErrorKind::ParseError {
message,
loc,
unicode,
},
SassErrorKind::FromUtf8Error(s) => PublicSassErrorKind::FromUtf8Error(s),
SassErrorKind::IoError(io) => PublicSassErrorKind::IoError(io),
SassErrorKind::Raw(..) => unreachable!("raw errors should not be accessible by users"),
}
}
pub(crate) fn raw(self) -> (String, Span) { pub(crate) fn raw(self) -> (String, Span) {
match self.kind { match self.kind {
SassErrorKind::Raw(string, span) => (string, span), SassErrorKind::Raw(string, span) => (string, span),
@ -55,6 +73,18 @@ impl SassError {
} }
} }
#[non_exhaustive]
#[derive(Debug, Clone)]
pub enum PublicSassErrorKind {
ParseError {
message: String,
loc: SpanLoc,
unicode: bool,
},
IoError(Arc<io::Error>),
FromUtf8Error(String),
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
enum SassErrorKind { enum SassErrorKind {
/// A raw error with no additional metadata /// A raw error with no additional metadata
@ -66,9 +96,8 @@ enum SassErrorKind {
loc: SpanLoc, loc: SpanLoc,
unicode: bool, unicode: bool,
}, },
// we put IoErrors in an `Rc` to allow it to be // we put `IoError`s in an `Arc` to allow them to be cloneable
// cloneable IoError(Arc<io::Error>),
IoError(Rc<io::Error>),
FromUtf8Error(String), FromUtf8Error(String),
} }
@ -86,7 +115,7 @@ impl Display for SassError {
} => (message, loc, *unicode), } => (message, loc, *unicode),
SassErrorKind::FromUtf8Error(s) => return writeln!(f, "Error: {}", s), SassErrorKind::FromUtf8Error(s) => return writeln!(f, "Error: {}", s),
SassErrorKind::IoError(s) => return writeln!(f, "Error: {}", s), SassErrorKind::IoError(s) => return writeln!(f, "Error: {}", s),
SassErrorKind::Raw(..) => todo!(), SassErrorKind::Raw(..) => unreachable!(),
}; };
let first_bar = if unicode { '╷' } else { '|' }; let first_bar = if unicode { '╷' } else { '|' };
@ -128,7 +157,7 @@ impl From<io::Error> for Box<SassError> {
#[inline] #[inline]
fn from(error: io::Error) -> Box<SassError> { fn from(error: io::Error) -> Box<SassError> {
Box::new(SassError { Box::new(SassError {
kind: SassErrorKind::IoError(Rc::new(error)), kind: SassErrorKind::IoError(Arc::new(error)),
}) })
} }
} }

View File

@ -58,7 +58,6 @@ grass input.scss
// this is only available on nightly // this is only available on nightly
clippy::unnested_or_patterns, clippy::unnested_or_patterns,
)] )]
#![cfg_attr(feature = "nightly", feature(track_caller))]
#![cfg_attr(feature = "profiling", inline(never))] #![cfg_attr(feature = "profiling", inline(never))]
use std::path::Path; use std::path::Path;
@ -70,7 +69,9 @@ pub(crate) use beef::lean::Cow;
use codemap::CodeMap; use codemap::CodeMap;
pub use crate::error::{SassError as Error, SassResult as Result}; pub use crate::error::{
PublicSassErrorKind as ErrorKind, SassError as Error, SassResult as Result,
};
pub use crate::fs::{Fs, NullFs, StdFs}; pub use crate::fs::{Fs, NullFs, StdFs};
pub(crate) use crate::token::Token; pub(crate) use crate::token::Token;
use crate::{ use crate::{