From b3525356c9bb7f0e11d293361694ae76867c49b7 Mon Sep 17 00:00:00 2001 From: sunli Date: Thu, 2 Apr 2020 12:37:04 +0800 Subject: [PATCH] Extract line and column from ParseError --- src/error.rs | 22 ++++++++++++++++++++-- src/http/mod.rs | 7 ++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/error.rs b/src/error.rs index 9834feb8..5b83d3ca 100644 --- a/src/error.rs +++ b/src/error.rs @@ -228,8 +228,22 @@ pub struct RuleError { impl From for Error { fn from(err: ParseError) -> Self { + let msg = err.to_string(); + let mut s = msg.splitn(2, "\n"); + let first = s.next().unwrap(); + let ln = &first[first.rfind(" ").unwrap() + 1..]; + let (line, column) = { + let mut s = ln.splitn(2, ":"); + ( + s.next().unwrap().parse().unwrap(), + s.next().unwrap().parse().unwrap(), + ) + }; + let tail = s.next().unwrap(); Error::Parse { - message: err.to_string(), + line, + column, + message: tail.to_string(), } } } @@ -238,7 +252,11 @@ impl From for Error { #[derive(Debug, Error)] pub enum Error { #[error("Parse error: {message}")] - Parse { message: String }, + Parse { + line: usize, + column: usize, + message: String, + }, #[error("Query error: {err}")] Query { diff --git a/src/http/mod.rs b/src/http/mod.rs index 13999f32..573741de 100644 --- a/src/http/mod.rs +++ b/src/http/mod.rs @@ -87,10 +87,15 @@ impl<'a> Serialize for GQLError<'a> { S: Serializer, { match self.0 { - Error::Parse { message } => { + Error::Parse { + line, + column, + message, + } => { let mut seq = serializer.serialize_seq(Some(1))?; seq.serialize_element(&serde_json::json! ({ "message": message, + "locations": [{"line": line, "column": column}] }))?; seq.end() }