#[cfg(doc)]
use crate::introspection;
use crate::parser::LineColumn;
use crate::parser::SourceMap;
use crate::parser::SourceSpan;
use serde::Deserialize;
use serde::Serialize;
pub use serde_json_bytes;
pub type JsonValue = serde_json_bytes::Value;
pub type JsonMap = serde_json_bytes::Map<serde_json_bytes::ByteString, JsonValue>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ExecutionResponse {
#[serde(skip_serializing_if = "Vec::is_empty")]
#[serde(default)]
pub errors: Vec<GraphQLError>,
pub data: Option<JsonMap>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct GraphQLError {
pub message: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
#[serde(default)]
pub locations: Vec<LineColumn>,
#[serde(skip_serializing_if = "Vec::is_empty")]
#[serde(default)]
pub path: Vec<ResponseDataPathSegment>,
#[serde(skip_serializing_if = "JsonMap::is_empty")]
#[serde(default)]
pub extensions: JsonMap,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ResponseDataPathSegment {
Field(crate::Name),
ListIndex(usize),
}
impl GraphQLError {
pub fn new(
message: impl Into<String>,
location: Option<SourceSpan>,
sources: &SourceMap,
) -> Self {
Self {
message: message.into(),
locations: location
.into_iter()
.filter_map(|location| location.line_column(sources))
.collect(),
path: Default::default(),
extensions: Default::default(),
}
}
}