Skip to content

Commit

Permalink
Use custom error type in parser and add verbose dates
Browse files Browse the repository at this point in the history
WilliamRagstad committed Jul 29, 2024
1 parent 9104060 commit 4b376d5
Showing 9 changed files with 417 additions and 341 deletions.
2 changes: 1 addition & 1 deletion examples/todo/index.wx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Todo, renderAllTodos, renderTodo } from "./todos";
/* import { Todo, renderAllTodos, renderTodo } from "./todos"; */

get / (<html>
<body>
1 change: 1 addition & 0 deletions src/analysis/dependencies.rs
Original file line number Diff line number Diff line change
@@ -53,6 +53,7 @@ fn analyse_circle_dependencies(modules: &[WXModule]) {
circular_dependencies
),
ERROR_CIRCULAR_DEPENDENCY,
false,
);
}
}
2 changes: 1 addition & 1 deletion src/analysis/routes.rs
Original file line number Diff line number Diff line change
@@ -115,7 +115,7 @@ pub fn analyse_invalid_routes(modules: &[WXModule]) -> Result<(), (String, i32)>

fn exit_on_err<T>(result: Result<T, (String, i32)>) {
if let Err((message, code)) = result {
exit_error(message, code);
exit_error(message, code, false);
}
}

6 changes: 4 additions & 2 deletions src/engine/runtime.rs
Original file line number Diff line number Diff line change
@@ -626,6 +626,7 @@ impl WXRuntime {
e
),
500,
self.mode.debug_level().is_max(),
);
}
info(
@@ -643,6 +644,7 @@ impl WXRuntime {
module.path.module_name()
),
500,
self.mode.debug_level().is_max(),
);
}
}
@@ -660,7 +662,7 @@ impl WXRuntime {
fn recompile(&mut self) {
match WXRouteMap::from_modules(&self.source_modules) {
Ok(routes) => self.routes = routes,
Err(err) => error_code(err.message, err.code),
Err(err) => error_code(err.message, err.code, self.mode.debug_level().is_max()),
}
if self.mode.is_dev() && self.mode.debug_level().is_high() {
// Print the route map in dev mode.
@@ -747,7 +749,7 @@ impl WXRuntime {
let response = match route_result {
Ok(response) => response,
Err(err) => {
error_code(err.message.to_string(), err.code);
error_code(err.message.to_string(), err.code, self.mode.debug_level().is_max());
responses::internal_server_error_default_webx(self.mode, err.message)
}
};
633 changes: 371 additions & 262 deletions src/file/parser.rs

Large diffs are not rendered by default.

17 changes: 16 additions & 1 deletion src/file/project.rs
Original file line number Diff line number Diff line change
@@ -14,6 +14,8 @@ use crate::{
runner::WXMode,
};

use super::parser::WebXParserError;

/// The configuration for a WebX project.
///
/// ## Example
@@ -136,6 +138,7 @@ pub fn locate_files(src: &Path) -> Vec<PathBuf> {
src.display()
),
ERROR_READ_WEBX_FILES,
false,
);
}

@@ -171,9 +174,21 @@ pub fn load_modules(src: &Path) -> Vec<WXModule> {
.map(|m| m.as_ref().unwrap_err())
.collect::<Vec<_>>();
if !errors.is_empty() {
let mut messages: String = "".into();
for err in errors {
match err {
WebXParserError::SyntaxError(message) => {
messages.push_str(&format!("syntax error:\n{}", message));
}
WebXParserError::IoError(err) => {
messages.push_str(&format!("IO error:\n{:?}", err));
}
}
}
exit_error(
format!("Failed to parse webx files:\n{:?}", errors),
format!("Failed to parse webx files due to a {}", messages),
ERROR_READ_WEBX_FILES,
false,
);
}
webx_modules
2 changes: 1 addition & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
@@ -106,7 +106,7 @@ fn main() {
let name = match matches.get_one::<String>("name") {
Some(name) => name.to_owned(),
None => {
error("No project name was provided.".to_string());
error("No project name was provided.".to_string(), false);
cli().print_help().unwrap();
std::process::exit(1);
}
94 changes: 21 additions & 73 deletions src/reporting/error.rs
Original file line number Diff line number Diff line change
@@ -31,92 +31,40 @@ fn error_generic(message: String, error_name: &str) {
eprintln!("{}: {}", error_name.red(), message);
}

fn error_generic_code(message: String, code: i32, error_name: &str) {
fn error_generic_code(message: String, code: i32, error_name: &str, verbose_date: bool) {
let now = Local::now();
let time = now.format("%d/%m %H:%M:%S");
let time = if verbose_date {
now.format("%d/%m %H:%M:%S")
} else {
now.format("%H:%M")
};
error_generic(
message,
format!("[{} {} ({})]", error_name, time, code_to_name(code)).as_str(),
);
}

fn exit_error_generic_code(message: String, code: i32, error_name: &str) -> ! {
error_generic_code(message, code, error_name);
fn exit_error_generic_code(message: String, code: i32, error_name: &str, verbose_date: bool) -> ! {
error_generic_code(message, code, error_name, verbose_date);
std::process::exit(code);
}

pub fn error(message: String) {
pub fn error(message: String, verbose_date: bool) {
let now = Local::now();
let time = now.format("%d/%m %H:%M:%S");
let time = if verbose_date {
now.format("%d/%m %H:%M:%S")
} else {
now.format("%H:%M")
};
error_generic(message, format!("[Error {}]", time).as_str());
}

pub fn error_code(message: String, code: i32) {
error_generic_code(message, code, "Error");
}

pub fn exit_error(message: String, code: i32) -> ! {
exit_error_generic_code(message, code, "Error");
}

pub fn exit_error_unexpected(
what: String,
context: &str,
line: usize,
column: usize,
code: i32,
) -> ! {
exit_error(
format!(
"Unexpected {} while {} at line {}, column {}",
what, context, line, column
),
code,
);
}

pub fn exit_error_expected_but_found(
expected: String,
found: String,
context: &str,
line: usize,
column: usize,
code: i32,
) -> ! {
exit_error(
format!(
"Expected {} but found '{}' while {} at line {}, column {}",
expected, found, context, line, column
),
code,
);
}

pub fn exit_error_expected_any_of_but_found(
expected: String,
found: char,
context: &str,
line: usize,
column: usize,
code: i32,
) -> ! {
exit_error(
format!(
"Expected any of {} but found '{}' while {} at line {}, column {}",
expected, found, context, line, column
),
code,
);
pub fn error_code(message: String, code: i32, verbose_date: bool) {
error_generic_code(message, code, "Error", verbose_date);
}

pub fn exit_error_unexpected_char(
what: char,
context: &str,
line: usize,
column: usize,
code: i32,
) -> ! {
exit_error_unexpected(format!("character '{}'", what), context, line, column, code);
pub fn exit_error(message: String, code: i32, verbose_date: bool) -> ! {
exit_error_generic_code(message, code, "Error", verbose_date);
}

pub fn format_info_field(info: &WXInfoField) -> String {
@@ -125,9 +73,9 @@ pub fn format_info_field(info: &WXInfoField) -> String {
.to_string()
}

pub fn exit_error_hint(message: &str, hints: &[&str], code: i32) -> ! {
pub fn exit_error_hint(message: &str, hints: &[&str], code: i32, verbose_date: bool) -> ! {
if hints.is_empty() {
exit_error(message.into(), code);
exit_error(message.into(), code, verbose_date);
}
let hints = if hints.len() > 1 {
const HINT_SEP: &str = "\n - ";
@@ -140,5 +88,5 @@ pub fn exit_error_hint(message: &str, hints: &[&str], code: i32) -> ! {
} else {
format!("{}: {}", "Hint".bright_yellow(), hints[0])
};
exit_error(format!("{}\n{}", message, hints), code)
exit_error(format!("{}\n{}", message, hints), code, verbose_date)
}
1 change: 1 addition & 0 deletions src/runner.rs
Original file line number Diff line number Diff line change
@@ -204,6 +204,7 @@ pub fn run(root: &Path, mode: WXMode) {
"Are you in the project root directory?",
],
ERROR_PROJECT,
false
);
};
let source_root = root.join(&config.src);

0 comments on commit 4b376d5

Please sign in to comment.