Struct async_graphql::extensions::ExtensionContext
source · pub struct ExtensionContext<'a> { /* private fields */ }
Expand description
Context for extension
Implementations§
source§impl<'a> ExtensionContext<'a>
impl<'a> ExtensionContext<'a>
sourcepub fn stringify_execute_doc(
&self,
doc: &ExecutableDocument,
variables: &Variables
) -> String
pub fn stringify_execute_doc(
&self,
doc: &ExecutableDocument,
variables: &Variables
) -> String
Convert the specified ExecutableDocument into a query string.
Usually used for log extension, it can hide secret arguments.
Examples found in repository?
src/extensions/tracing.rs (line 94)
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
async fn parse_query(
&self,
ctx: &ExtensionContext<'_>,
query: &str,
variables: &Variables,
next: NextParseQuery<'_>,
) -> ServerResult<ExecutableDocument> {
let span = span!(
target: "async_graphql::graphql",
Level::INFO,
"parse",
);
async move {
let res = next.run(ctx, query, variables).await;
if let Ok(doc) = &res {
tracinglib::Span::current().record(
"source",
&ctx.stringify_execute_doc(doc, variables).as_str(),
);
}
res
}
.instrument(span)
.await
}
More examples
src/extensions/logger.rs (line 39)
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
async fn parse_query(
&self,
ctx: &ExtensionContext<'_>,
query: &str,
variables: &Variables,
next: NextParseQuery<'_>,
) -> ServerResult<ExecutableDocument> {
let document = next.run(ctx, query, variables).await?;
let is_schema = document
.operations
.iter()
.filter(|(_, operation)| operation.node.ty == OperationType::Query)
.any(|(_, operation)| operation.node.selection_set.node.items.iter().any(|selection| matches!(&selection.node, Selection::Field(field) if field.node.name.node == "__schema")));
if !is_schema {
log::info!(
target: "async-graphql",
"[Execute] {}", ctx.stringify_execute_doc(&document, variables)
);
}
Ok(document)
}
src/extensions/opentelemetry.rs (line 119)
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
async fn parse_query(
&self,
ctx: &ExtensionContext<'_>,
query: &str,
variables: &Variables,
next: NextParseQuery<'_>,
) -> ServerResult<ExecutableDocument> {
let attributes = vec![
KEY_SOURCE.string(query.to_string()),
KEY_VARIABLES.string(serde_json::to_string(variables).unwrap()),
];
let span = self
.tracer
.span_builder("parse")
.with_kind(SpanKind::Server)
.with_attributes(attributes)
.start(&*self.tracer);
async move {
let res = next.run(ctx, query, variables).await;
if let Ok(doc) = &res {
OpenTelemetryContext::current()
.span()
.set_attribute(KEY_SOURCE.string(ctx.stringify_execute_doc(doc, variables)));
}
res
}
.with_context(OpenTelemetryContext::current_with_span(span))
.await
}
sourcepub fn data<D: Any + Send + Sync>(&self) -> Result<&'a D>
pub fn data<D: Any + Send + Sync>(&self) -> Result<&'a D>
Gets the global data defined in the Context
or Schema
.
If both Schema
and Query
have the same data type, the data in the
Query
is obtained.
Errors
Returns a Error
if the specified type data does not exist.
sourcepub fn data_unchecked<D: Any + Send + Sync>(&self) -> &'a D
pub fn data_unchecked<D: Any + Send + Sync>(&self) -> &'a D
Gets the global data defined in the Context
or Schema
.
Panics
It will panic if the specified data type does not exist.
sourcepub fn data_opt<D: Any + Send + Sync>(&self) -> Option<&'a D>
pub fn data_opt<D: Any + Send + Sync>(&self) -> Option<&'a D>
Gets the global data defined in the Context
or Schema
or None
if
the specified type data does not exist.
Examples found in repository?
src/extensions/mod.rs (line 59)
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
fn data_opt<D: Any + Send + Sync>(&self) -> Option<&'a D> {
ExtensionContext::data_opt::<D>(self)
}
}
impl<'a> ExtensionContext<'a> {
/// Convert the specified [ExecutableDocument] into a query string.
///
/// Usually used for log extension, it can hide secret arguments.
pub fn stringify_execute_doc(&self, doc: &ExecutableDocument, variables: &Variables) -> String {
self.schema_env
.registry
.stringify_exec_doc(variables, doc)
.unwrap_or_default()
}
/// Gets the global data defined in the `Context` or `Schema`.
///
/// If both `Schema` and `Query` have the same data type, the data in the
/// `Query` is obtained.
///
/// # Errors
///
/// Returns a `Error` if the specified type data does not exist.
pub fn data<D: Any + Send + Sync>(&self) -> Result<&'a D> {
self.data_opt::<D>().ok_or_else(|| {
Error::new(format!(
"Data `{}` does not exist.",
std::any::type_name::<D>()
))
})
}
/// Gets the global data defined in the `Context` or `Schema`.
///
/// # Panics
///
/// It will panic if the specified data type does not exist.
pub fn data_unchecked<D: Any + Send + Sync>(&self) -> &'a D {
self.data_opt::<D>()
.unwrap_or_else(|| panic!("Data `{}` does not exist.", std::any::type_name::<D>()))
}