grafbase_sdk/
extension.rs#![allow(static_mut_refs)]
pub mod authentication;
pub mod resolver;
pub use authentication::Authenticator;
pub use resolver::Resolver;
use crate::{
types::{Configuration, FieldInputs},
wit::{Directive, Error, ExtensionType, FieldDefinition, FieldOutput, Guest, Headers, SharedContext, Token},
Component,
};
pub trait Extension {
fn new(
schema_directives: Vec<crate::types::Directive>,
config: Configuration,
) -> Result<Self, Box<dyn std::error::Error>>
where
Self: Sized;
}
impl Guest for Component {
fn init_gateway_extension(
r#type: ExtensionType,
directives: Vec<Directive>,
configuration: Vec<u8>,
) -> Result<(), String> {
let directives = directives.into_iter().map(Into::into).collect();
let config = Configuration::new(configuration);
let result = match r#type {
ExtensionType::Resolver => resolver::init(directives, config),
ExtensionType::Authentication => authentication::init(directives, config),
};
result.map_err(|e| e.to_string())
}
fn resolve_field(
context: SharedContext,
directive: Directive,
definition: FieldDefinition,
inputs: Vec<Vec<u8>>,
) -> Result<FieldOutput, Error> {
let result = resolver::get_extension()?.resolve_field(
context,
directive.into(),
definition.into(),
FieldInputs::new(inputs),
);
result.map(Into::into)
}
fn authenticate(headers: Headers) -> Result<Token, crate::wit::ErrorResponse> {
let result = authentication::get_extension()
.map_err(|_| crate::wit::ErrorResponse {
status_code: 500,
errors: vec![Error {
extensions: Vec::new(),
message: String::from("internal server error"),
}],
})?
.authenticate(headers);
result.map(Into::into).map_err(Into::into)
}
}