2019-05-16 00:58:44 +02:00
|
|
|
#[allow(unused)]
|
2019-05-15 20:14:51 +02:00
|
|
|
use crate::prelude::*;
|
2019-06-22 05:43:37 +02:00
|
|
|
|
2019-06-30 08:14:40 +02:00
|
|
|
use ansi_term::Color;
|
2019-05-10 18:59:12 +02:00
|
|
|
use derive_new::new;
|
2019-06-08 00:35:07 +02:00
|
|
|
use language_reporting::{Diagnostic, Label, Severity};
|
2019-07-13 18:59:59 +02:00
|
|
|
use serde::{Deserialize, Serialize};
|
2019-05-10 18:59:12 +02:00
|
|
|
|
2019-06-24 02:55:31 +02:00
|
|
|
#[derive(Debug, Eq, PartialEq, Clone, Ord, PartialOrd, Serialize, Deserialize)]
|
|
|
|
pub enum Description {
|
2019-08-01 03:58:42 +02:00
|
|
|
Source(Tagged<String>),
|
2019-06-24 02:55:31 +02:00
|
|
|
Synthetic(String),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Description {
|
2019-08-01 03:58:42 +02:00
|
|
|
pub fn from(value: Tagged<impl Into<String>>) -> Description {
|
|
|
|
let value_span = value.span();
|
2019-08-05 10:54:29 +02:00
|
|
|
let value_tag = value.tag();
|
2019-08-01 03:58:42 +02:00
|
|
|
|
|
|
|
match value_span {
|
2019-08-05 10:54:29 +02:00
|
|
|
Span { start: 0, end: 0 } => Description::Synthetic(value.item.into()),
|
|
|
|
_ => Description::Source(Tagged::from_item(value.item.into(), value_tag)),
|
2019-06-24 02:55:31 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Description {
|
|
|
|
fn into_label(self) -> Result<Label<Span>, String> {
|
|
|
|
match self {
|
2019-08-01 03:58:42 +02:00
|
|
|
Description::Source(s) => Ok(Label::new_primary(s.span()).with_message(s.item)),
|
2019-06-24 02:55:31 +02:00
|
|
|
Description::Synthetic(s) => Err(s),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-30 08:14:40 +02:00
|
|
|
#[derive(Debug, Eq, PartialEq, Clone, Ord, PartialOrd, Serialize, Deserialize)]
|
|
|
|
pub enum ArgumentError {
|
|
|
|
MissingMandatoryFlag(String),
|
|
|
|
MissingMandatoryPositional(String),
|
|
|
|
MissingValueForName(String),
|
|
|
|
}
|
|
|
|
|
2019-07-03 22:31:15 +02:00
|
|
|
pub fn labelled(
|
2019-08-05 10:54:29 +02:00
|
|
|
span: impl Into<Span>,
|
2019-07-03 22:31:15 +02:00
|
|
|
heading: &'a str,
|
|
|
|
span_message: &'a str,
|
|
|
|
) -> impl FnOnce(ShellError) -> ShellError + 'a {
|
|
|
|
let span = span.into();
|
|
|
|
|
2019-08-05 10:54:29 +02:00
|
|
|
move |_| ShellError::labeled_error(heading, span_message, span)
|
2019-07-03 22:31:15 +02:00
|
|
|
}
|
|
|
|
|
2019-06-01 07:50:16 +02:00
|
|
|
#[derive(Debug, Eq, PartialEq, Clone, Ord, PartialOrd, Serialize, Deserialize)]
|
2019-07-09 06:31:26 +02:00
|
|
|
pub struct ShellError {
|
|
|
|
error: ProximateShellError,
|
|
|
|
cause: Option<Box<ProximateShellError>>,
|
2019-05-13 19:30:51 +02:00
|
|
|
}
|
|
|
|
|
2019-08-02 21:15:07 +02:00
|
|
|
impl serde::de::Error for ShellError {
|
|
|
|
fn custom<T>(msg: T) -> Self
|
|
|
|
where
|
|
|
|
T: std::fmt::Display,
|
|
|
|
{
|
|
|
|
ShellError::string(msg.to_string())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-13 19:30:51 +02:00
|
|
|
impl ShellError {
|
2019-06-29 10:55:42 +02:00
|
|
|
crate fn type_error(
|
|
|
|
expected: impl Into<String>,
|
2019-08-01 03:58:42 +02:00
|
|
|
actual: Tagged<impl Into<String>>,
|
2019-06-29 10:55:42 +02:00
|
|
|
) -> ShellError {
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::TypeError {
|
2019-06-29 10:55:42 +02:00
|
|
|
expected: expected.into(),
|
|
|
|
actual: actual.map(|i| Some(i.into())),
|
|
|
|
}
|
2019-07-09 06:31:26 +02:00
|
|
|
.start()
|
|
|
|
}
|
|
|
|
|
2019-08-16 00:18:18 +02:00
|
|
|
crate fn syntax_error(problem: Tagged<impl Into<String>>) -> ShellError {
|
|
|
|
ProximateShellError::SyntaxError {
|
|
|
|
problem: problem.map(|p| p.into()),
|
|
|
|
}
|
|
|
|
.start()
|
|
|
|
}
|
|
|
|
|
|
|
|
crate fn invalid_command(problem: impl Into<Tag>) -> ShellError {
|
|
|
|
ProximateShellError::InvalidCommand {
|
|
|
|
command: problem.into(),
|
|
|
|
}
|
|
|
|
.start()
|
|
|
|
}
|
|
|
|
|
2019-07-09 06:31:26 +02:00
|
|
|
crate fn coerce_error(
|
2019-08-01 03:58:42 +02:00
|
|
|
left: Tagged<impl Into<String>>,
|
|
|
|
right: Tagged<impl Into<String>>,
|
2019-07-09 06:31:26 +02:00
|
|
|
) -> ShellError {
|
|
|
|
ProximateShellError::CoerceError {
|
|
|
|
left: left.map(|l| l.into()),
|
|
|
|
right: right.map(|r| r.into()),
|
|
|
|
}
|
|
|
|
.start()
|
|
|
|
}
|
|
|
|
|
|
|
|
crate fn missing_property(subpath: Description, expr: Description) -> ShellError {
|
|
|
|
ProximateShellError::MissingProperty { subpath, expr }.start()
|
|
|
|
}
|
|
|
|
|
2019-08-17 05:53:39 +02:00
|
|
|
crate fn missing_value(span: Option<Span>, reason: impl Into<String>) -> ShellError {
|
|
|
|
ProximateShellError::MissingValue {
|
|
|
|
span,
|
|
|
|
reason: reason.into(),
|
|
|
|
}
|
|
|
|
.start()
|
|
|
|
}
|
|
|
|
|
2019-07-09 06:31:26 +02:00
|
|
|
crate fn argument_error(
|
|
|
|
command: impl Into<String>,
|
|
|
|
kind: ArgumentError,
|
|
|
|
span: Span,
|
|
|
|
) -> ShellError {
|
|
|
|
ProximateShellError::ArgumentError {
|
|
|
|
command: command.into(),
|
|
|
|
error: kind,
|
|
|
|
span: span,
|
|
|
|
}
|
|
|
|
.start()
|
2019-06-29 10:55:42 +02:00
|
|
|
}
|
|
|
|
|
2019-05-30 06:19:46 +02:00
|
|
|
crate fn parse_error(
|
2019-07-16 21:10:25 +02:00
|
|
|
error: nom::Err<(nom5_locate::LocatedSpan<&str>, nom::error::ErrorKind)>,
|
2019-05-30 06:19:46 +02:00
|
|
|
) -> ShellError {
|
|
|
|
use language_reporting::*;
|
|
|
|
|
|
|
|
match error {
|
2019-06-22 05:43:37 +02:00
|
|
|
nom::Err::Incomplete(_) => unreachable!(),
|
|
|
|
nom::Err::Failure(span) | nom::Err::Error(span) => {
|
2019-06-29 10:55:42 +02:00
|
|
|
let diagnostic = Diagnostic::new(Severity::Error, format!("Parse Error"))
|
|
|
|
.with_label(Label::new_primary(Span::from(span.0)));
|
2019-05-30 06:19:46 +02:00
|
|
|
|
2019-06-08 00:35:07 +02:00
|
|
|
ShellError::diagnostic(diagnostic)
|
2019-07-09 06:31:26 +02:00
|
|
|
}
|
2019-05-30 06:19:46 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-08 00:35:07 +02:00
|
|
|
crate fn diagnostic(diagnostic: Diagnostic<Span>) -> ShellError {
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::Diagnostic(ShellDiagnostic { diagnostic }).start()
|
2019-06-08 00:35:07 +02:00
|
|
|
}
|
|
|
|
|
2019-06-24 02:55:31 +02:00
|
|
|
crate fn to_diagnostic(self) -> Diagnostic<Span> {
|
2019-07-09 06:31:26 +02:00
|
|
|
match self.error {
|
|
|
|
ProximateShellError::String(StringError { title, .. }) => {
|
2019-06-24 02:55:31 +02:00
|
|
|
Diagnostic::new(Severity::Error, title)
|
|
|
|
}
|
2019-08-16 00:18:18 +02:00
|
|
|
ProximateShellError::InvalidCommand { command } => {
|
|
|
|
Diagnostic::new(Severity::Error, "Invalid command")
|
|
|
|
.with_label(Label::new_primary(command.span))
|
|
|
|
}
|
2019-08-17 05:53:39 +02:00
|
|
|
ProximateShellError::MissingValue { span, reason } => {
|
|
|
|
let mut d = Diagnostic::new(
|
|
|
|
Severity::Bug,
|
|
|
|
format!("Internal Error (missing value) :: {}", reason),
|
|
|
|
);
|
|
|
|
|
|
|
|
if let Some(span) = span {
|
|
|
|
d = d.with_label(Label::new_primary(span));
|
|
|
|
}
|
|
|
|
|
|
|
|
d
|
|
|
|
}
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::ArgumentError {
|
2019-07-03 22:31:15 +02:00
|
|
|
command,
|
|
|
|
error,
|
|
|
|
span,
|
|
|
|
} => match error {
|
2019-06-30 08:14:40 +02:00
|
|
|
ArgumentError::MissingMandatoryFlag(name) => Diagnostic::new(
|
|
|
|
Severity::Error,
|
|
|
|
format!(
|
2019-07-03 22:31:15 +02:00
|
|
|
"{} requires {}{}",
|
|
|
|
Color::Cyan.paint(command),
|
|
|
|
Color::Black.bold().paint("--"),
|
|
|
|
Color::Black.bold().paint(name)
|
2019-06-30 08:14:40 +02:00
|
|
|
),
|
|
|
|
)
|
|
|
|
.with_label(Label::new_primary(span)),
|
|
|
|
ArgumentError::MissingMandatoryPositional(name) => Diagnostic::new(
|
|
|
|
Severity::Error,
|
2019-07-03 22:31:15 +02:00
|
|
|
format!(
|
2019-08-20 08:11:11 +02:00
|
|
|
"{} requires {} parameter",
|
2019-07-03 22:31:15 +02:00
|
|
|
Color::Cyan.paint(command),
|
2019-08-20 08:11:11 +02:00
|
|
|
Color::Green.bold().paint(name.clone())
|
2019-07-03 22:31:15 +02:00
|
|
|
),
|
2019-06-30 08:14:40 +02:00
|
|
|
)
|
2019-08-20 08:11:11 +02:00
|
|
|
.with_label(
|
|
|
|
Label::new_primary(span).with_message(format!("requires {} parameter", name)),
|
|
|
|
),
|
2019-06-30 08:14:40 +02:00
|
|
|
ArgumentError::MissingValueForName(name) => Diagnostic::new(
|
|
|
|
Severity::Error,
|
|
|
|
format!(
|
2019-07-03 22:31:15 +02:00
|
|
|
"{} is missing value for flag {}{}",
|
|
|
|
Color::Cyan.paint(command),
|
|
|
|
Color::Black.bold().paint("--"),
|
|
|
|
Color::Black.bold().paint(name)
|
2019-06-30 08:14:40 +02:00
|
|
|
),
|
|
|
|
)
|
|
|
|
.with_label(Label::new_primary(span)),
|
|
|
|
},
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::TypeError {
|
2019-06-29 10:55:42 +02:00
|
|
|
expected,
|
|
|
|
actual:
|
2019-08-01 03:58:42 +02:00
|
|
|
Tagged {
|
2019-06-29 10:55:42 +02:00
|
|
|
item: Some(actual),
|
2019-08-05 10:54:29 +02:00
|
|
|
tag: Tag { span, .. },
|
2019-06-29 10:55:42 +02:00
|
|
|
},
|
|
|
|
} => Diagnostic::new(Severity::Error, "Type Error").with_label(
|
|
|
|
Label::new_primary(span)
|
|
|
|
.with_message(format!("Expected {}, found {}", expected, actual)),
|
|
|
|
),
|
|
|
|
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::TypeError {
|
2019-06-29 10:55:42 +02:00
|
|
|
expected,
|
2019-08-01 03:58:42 +02:00
|
|
|
actual:
|
|
|
|
Tagged {
|
|
|
|
item: None,
|
2019-08-05 10:54:29 +02:00
|
|
|
tag: Tag { span, .. },
|
2019-08-01 03:58:42 +02:00
|
|
|
},
|
2019-06-29 10:55:42 +02:00
|
|
|
} => Diagnostic::new(Severity::Error, "Type Error")
|
|
|
|
.with_label(Label::new_primary(span).with_message(expected)),
|
2019-06-24 02:55:31 +02:00
|
|
|
|
2019-08-16 00:18:18 +02:00
|
|
|
ProximateShellError::SyntaxError {
|
|
|
|
problem:
|
|
|
|
Tagged {
|
|
|
|
tag: Tag { span, .. },
|
|
|
|
..
|
|
|
|
},
|
|
|
|
} => Diagnostic::new(Severity::Error, "Syntax Error")
|
|
|
|
.with_label(Label::new_primary(span).with_message("Unexpected external command")),
|
|
|
|
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::MissingProperty { subpath, expr } => {
|
2019-06-24 02:55:31 +02:00
|
|
|
let subpath = subpath.into_label();
|
|
|
|
let expr = expr.into_label();
|
|
|
|
|
|
|
|
let mut diag = Diagnostic::new(Severity::Error, "Missing property");
|
|
|
|
|
|
|
|
match subpath {
|
|
|
|
Ok(label) => diag = diag.with_label(label),
|
|
|
|
Err(ty) => diag.message = format!("Missing property (for {})", ty),
|
|
|
|
}
|
|
|
|
|
|
|
|
if let Ok(label) = expr {
|
2019-08-15 18:49:07 +02:00
|
|
|
diag = diag.with_label(label);
|
2019-06-24 02:55:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
diag
|
|
|
|
}
|
|
|
|
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::Diagnostic(diag) => diag.diagnostic,
|
|
|
|
ProximateShellError::CoerceError { left, right } => {
|
2019-06-24 02:55:31 +02:00
|
|
|
Diagnostic::new(Severity::Error, "Coercion error")
|
2019-08-01 03:58:42 +02:00
|
|
|
.with_label(Label::new_primary(left.span()).with_message(left.item))
|
|
|
|
.with_label(Label::new_secondary(right.span()).with_message(right.item))
|
2019-06-24 02:55:31 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-13 18:59:59 +02:00
|
|
|
pub fn labeled_error(
|
2019-06-08 00:35:07 +02:00
|
|
|
msg: impl Into<String>,
|
|
|
|
label: impl Into<String>,
|
2019-08-17 05:53:39 +02:00
|
|
|
span: impl Into<Span>,
|
2019-06-08 00:35:07 +02:00
|
|
|
) -> ShellError {
|
|
|
|
ShellError::diagnostic(
|
|
|
|
Diagnostic::new(Severity::Error, msg.into())
|
2019-08-17 05:53:39 +02:00
|
|
|
.with_label(Label::new_primary(span.into()).with_message(label.into())),
|
2019-06-08 00:35:07 +02:00
|
|
|
)
|
2019-05-30 06:19:46 +02:00
|
|
|
}
|
|
|
|
|
2019-08-05 10:54:29 +02:00
|
|
|
pub fn labeled_error_with_secondary(
|
2019-06-15 20:36:17 +02:00
|
|
|
msg: impl Into<String>,
|
2019-08-05 10:54:29 +02:00
|
|
|
primary_label: impl Into<String>,
|
|
|
|
primary_span: Span,
|
|
|
|
secondary_label: impl Into<String>,
|
|
|
|
secondary_span: Span,
|
2019-06-15 20:36:17 +02:00
|
|
|
) -> ShellError {
|
2019-08-05 10:54:29 +02:00
|
|
|
ShellError::diagnostic(
|
|
|
|
Diagnostic::new_error(msg.into())
|
|
|
|
.with_label(Label::new_primary(primary_span).with_message(primary_label.into()))
|
|
|
|
.with_label(
|
|
|
|
Label::new_secondary(secondary_span).with_message(secondary_label.into()),
|
|
|
|
),
|
|
|
|
)
|
2019-06-15 20:36:17 +02:00
|
|
|
}
|
|
|
|
|
2019-06-27 06:56:48 +02:00
|
|
|
pub fn string(title: impl Into<String>) -> ShellError {
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::String(StringError::new(title.into(), Value::nothing())).start()
|
2019-05-13 19:30:51 +02:00
|
|
|
}
|
2019-05-15 20:14:51 +02:00
|
|
|
|
2019-06-04 23:42:31 +02:00
|
|
|
crate fn unimplemented(title: impl Into<String>) -> ShellError {
|
|
|
|
ShellError::string(&format!("Unimplemented: {}", title.into()))
|
|
|
|
}
|
|
|
|
|
2019-06-22 05:43:37 +02:00
|
|
|
crate fn unexpected(title: impl Into<String>) -> ShellError {
|
|
|
|
ShellError::string(&format!("Unexpected: {}", title.into()))
|
|
|
|
}
|
2019-05-30 06:19:46 +02:00
|
|
|
}
|
2019-05-16 23:43:36 +02:00
|
|
|
|
2019-07-09 06:31:26 +02:00
|
|
|
#[derive(Debug, Eq, PartialEq, Clone, Ord, PartialOrd, Serialize, Deserialize)]
|
|
|
|
pub enum ProximateShellError {
|
|
|
|
String(StringError),
|
2019-08-16 00:18:18 +02:00
|
|
|
SyntaxError {
|
|
|
|
problem: Tagged<String>,
|
|
|
|
},
|
|
|
|
InvalidCommand {
|
|
|
|
command: Tag,
|
|
|
|
},
|
2019-07-09 06:31:26 +02:00
|
|
|
TypeError {
|
|
|
|
expected: String,
|
2019-08-01 03:58:42 +02:00
|
|
|
actual: Tagged<Option<String>>,
|
2019-07-09 06:31:26 +02:00
|
|
|
},
|
|
|
|
MissingProperty {
|
|
|
|
subpath: Description,
|
|
|
|
expr: Description,
|
|
|
|
},
|
2019-08-17 05:53:39 +02:00
|
|
|
MissingValue {
|
|
|
|
span: Option<Span>,
|
|
|
|
reason: String,
|
|
|
|
},
|
2019-07-09 06:31:26 +02:00
|
|
|
ArgumentError {
|
|
|
|
command: String,
|
|
|
|
error: ArgumentError,
|
|
|
|
span: Span,
|
|
|
|
},
|
|
|
|
Diagnostic(ShellDiagnostic),
|
|
|
|
CoerceError {
|
2019-08-01 03:58:42 +02:00
|
|
|
left: Tagged<String>,
|
|
|
|
right: Tagged<String>,
|
2019-07-09 06:31:26 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
impl ProximateShellError {
|
|
|
|
fn start(self) -> ShellError {
|
|
|
|
ShellError {
|
|
|
|
cause: None,
|
|
|
|
error: self,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-13 18:59:59 +02:00
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
2019-05-30 06:19:46 +02:00
|
|
|
pub struct ShellDiagnostic {
|
|
|
|
crate diagnostic: Diagnostic<Span>,
|
|
|
|
}
|
|
|
|
|
2019-06-04 23:42:31 +02:00
|
|
|
impl ShellDiagnostic {
|
2019-06-06 08:34:59 +02:00
|
|
|
#[allow(unused)]
|
2019-06-04 23:42:31 +02:00
|
|
|
crate fn simple_diagnostic(
|
|
|
|
span: impl Into<Span>,
|
|
|
|
source: impl Into<String>,
|
|
|
|
) -> ShellDiagnostic {
|
|
|
|
use language_reporting::*;
|
|
|
|
|
|
|
|
let span = span.into();
|
|
|
|
let source = source.into();
|
|
|
|
|
|
|
|
let diagnostic =
|
|
|
|
Diagnostic::new(Severity::Error, "Parse error").with_label(Label::new_primary(span));
|
|
|
|
|
|
|
|
ShellDiagnostic { diagnostic }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-30 06:19:46 +02:00
|
|
|
impl PartialEq for ShellDiagnostic {
|
|
|
|
fn eq(&self, _other: &ShellDiagnostic) -> bool {
|
|
|
|
false
|
2019-05-16 23:43:36 +02:00
|
|
|
}
|
2019-05-10 18:59:12 +02:00
|
|
|
}
|
|
|
|
|
2019-05-30 06:19:46 +02:00
|
|
|
impl Eq for ShellDiagnostic {}
|
|
|
|
|
|
|
|
impl std::cmp::PartialOrd for ShellDiagnostic {
|
|
|
|
fn partial_cmp(&self, _other: &Self) -> Option<std::cmp::Ordering> {
|
|
|
|
Some(std::cmp::Ordering::Less)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl std::cmp::Ord for ShellDiagnostic {
|
|
|
|
fn cmp(&self, _other: &Self) -> std::cmp::Ordering {
|
|
|
|
std::cmp::Ordering::Less
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-01 07:50:16 +02:00
|
|
|
#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, new, Clone, Serialize, Deserialize)]
|
2019-05-30 06:19:46 +02:00
|
|
|
pub struct StringError {
|
|
|
|
title: String,
|
|
|
|
error: Value,
|
|
|
|
}
|
|
|
|
|
2019-05-10 18:59:12 +02:00
|
|
|
impl std::fmt::Display for ShellError {
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
2019-07-09 06:31:26 +02:00
|
|
|
match &self.error {
|
|
|
|
ProximateShellError::String(s) => write!(f, "{}", &s.title),
|
2019-08-17 05:53:39 +02:00
|
|
|
ProximateShellError::MissingValue { .. } => write!(f, "MissingValue"),
|
2019-08-16 00:18:18 +02:00
|
|
|
ProximateShellError::InvalidCommand { .. } => write!(f, "InvalidCommand"),
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::TypeError { .. } => write!(f, "TypeError"),
|
2019-08-16 00:18:18 +02:00
|
|
|
ProximateShellError::SyntaxError { .. } => write!(f, "SyntaxError"),
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::MissingProperty { .. } => write!(f, "MissingProperty"),
|
|
|
|
ProximateShellError::ArgumentError { .. } => write!(f, "ArgumentError"),
|
|
|
|
ProximateShellError::Diagnostic(_) => write!(f, "<diagnostic>"),
|
|
|
|
ProximateShellError::CoerceError { .. } => write!(f, "CoerceError"),
|
2019-05-30 06:19:46 +02:00
|
|
|
}
|
2019-05-10 18:59:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl std::error::Error for ShellError {}
|
|
|
|
|
2019-08-21 14:08:23 +02:00
|
|
|
impl std::convert::From<Box<dyn std::error::Error>> for ShellError {
|
|
|
|
fn from(input: Box<dyn std::error::Error>) -> ShellError {
|
|
|
|
ProximateShellError::String(StringError {
|
|
|
|
title: format!("{}", input),
|
|
|
|
error: Value::nothing(),
|
|
|
|
})
|
|
|
|
.start()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-10 18:59:12 +02:00
|
|
|
impl std::convert::From<std::io::Error> for ShellError {
|
|
|
|
fn from(input: std::io::Error) -> ShellError {
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::String(StringError {
|
2019-05-10 18:59:12 +02:00
|
|
|
title: format!("{}", input),
|
2019-05-13 19:30:51 +02:00
|
|
|
error: Value::nothing(),
|
2019-05-30 06:19:46 +02:00
|
|
|
})
|
2019-07-09 06:31:26 +02:00
|
|
|
.start()
|
2019-05-10 18:59:12 +02:00
|
|
|
}
|
|
|
|
}
|
2019-05-24 06:34:43 +02:00
|
|
|
|
2019-05-24 09:29:16 +02:00
|
|
|
impl std::convert::From<subprocess::PopenError> for ShellError {
|
|
|
|
fn from(input: subprocess::PopenError) -> ShellError {
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::String(StringError {
|
2019-05-24 09:29:16 +02:00
|
|
|
title: format!("{}", input),
|
|
|
|
error: Value::nothing(),
|
2019-05-30 06:19:46 +02:00
|
|
|
})
|
2019-07-09 06:31:26 +02:00
|
|
|
.start()
|
2019-05-24 09:29:16 +02:00
|
|
|
}
|
|
|
|
}
|
2019-05-26 08:54:41 +02:00
|
|
|
|
2019-08-21 14:08:23 +02:00
|
|
|
impl std::convert::From<serde_yaml::Error> for ShellError {
|
|
|
|
fn from(input: serde_yaml::Error) -> ShellError {
|
|
|
|
ProximateShellError::String(StringError {
|
|
|
|
title: format!("{:?}", input),
|
|
|
|
error: Value::nothing(),
|
|
|
|
})
|
|
|
|
.start()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-06-01 07:50:16 +02:00
|
|
|
impl std::convert::From<toml::ser::Error> for ShellError {
|
|
|
|
fn from(input: toml::ser::Error) -> ShellError {
|
2019-07-09 06:31:26 +02:00
|
|
|
ProximateShellError::String(StringError {
|
2019-06-01 07:50:16 +02:00
|
|
|
title: format!("{:?}", input),
|
|
|
|
error: Value::nothing(),
|
|
|
|
})
|
2019-07-09 06:31:26 +02:00
|
|
|
.start()
|
2019-06-01 07:50:16 +02:00
|
|
|
}
|
|
|
|
}
|
2019-08-17 05:53:39 +02:00
|
|
|
|
|
|
|
impl std::convert::From<serde_json::Error> for ShellError {
|
|
|
|
fn from(input: serde_json::Error) -> ShellError {
|
|
|
|
ProximateShellError::String(StringError {
|
|
|
|
title: format!("{:?}", input),
|
|
|
|
error: Value::nothing(),
|
|
|
|
})
|
|
|
|
.start()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl std::convert::From<regex::Error> for ShellError {
|
|
|
|
fn from(input: regex::Error) -> ShellError {
|
|
|
|
ProximateShellError::String(StringError {
|
|
|
|
title: format!("{:?}", input),
|
|
|
|
error: Value::nothing(),
|
|
|
|
})
|
|
|
|
.start()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub trait ShellErrorUtils<T> {
|
|
|
|
fn unwrap_error(self, desc: impl Into<String>) -> Result<T, ShellError>;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> ShellErrorUtils<Tagged<T>> for Option<Tagged<T>> {
|
|
|
|
fn unwrap_error(self, desc: impl Into<String>) -> Result<Tagged<T>, ShellError> {
|
|
|
|
match self {
|
|
|
|
Some(value) => Ok(value),
|
|
|
|
None => Err(ShellError::missing_value(None, desc.into())),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|