Skip to content

Commit

Permalink
Break things out for readability
Browse files Browse the repository at this point in the history
  • Loading branch information
deekerno committed Dec 8, 2023
1 parent e42accb commit 4b55e97
Show file tree
Hide file tree
Showing 6 changed files with 1,331 additions and 1,292 deletions.
17 changes: 14 additions & 3 deletions packages/fuel-indexer-graphql/src/dynamic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ use fuel_indexer_schema::db::tables::IndexerSchema;
use lazy_static::lazy_static;
use serde_json::Value;

use crate::{query::ParsedOperation, GraphqlError, GraphqlResult};
use crate::{
query::{parse::ParsedOperation, prepare::prepare_operation},
GraphqlError, GraphqlResult,
};

lazy_static! {
/// Scalar types supported by the Fuel indexer. These should always stay up-to-date
Expand Down Expand Up @@ -140,7 +143,11 @@ pub async fn execute_query(
None,
)?;

let query = parsed.prepare(schema.parsed(), &pool.database_type())?;
let query = prepare_operation(
&parsed,
schema.parsed(),
&pool.database_type(),
)?;
vec![query.to_string()]
}
DocumentOperations::Multiple(op_defs) => {
Expand All @@ -152,7 +159,11 @@ pub async fn execute_query(
&exec_doc.fragments,
Some(name.to_string()),
)?;
let s = parsed.prepare(schema.parsed(), &pool.database_type())?;
let s = prepare_operation(
&parsed,
schema.parsed(),
&pool.database_type(),
)?;
v.push(s.to_string());
}

Expand Down
68 changes: 68 additions & 0 deletions packages/fuel-indexer-graphql/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ pub mod arguments;
pub mod dynamic;
pub mod query;

use arguments::ParamType;
use async_graphql_parser::Positioned;
use async_graphql_value::Name;
use thiserror::Error;
pub type GraphqlResult<T> = Result<T, GraphqlError>;

Expand Down Expand Up @@ -48,3 +51,68 @@ pub enum GraphqlError {
#[error("Could not get base entity type for field: {0:?}")]
CouldNotGetBaseEntityType(String),
}

#[derive(Debug, Clone)]
pub enum ParsedQueryKind {
Object,
Connection,
}

/// The type of selection that can be present in a user's operation.
#[derive(Debug, Clone)]
pub enum ParsedSelection {
Scalar {
name: Name,
parent_entity: String,
alias: Option<Positioned<Name>>,
},
Object {
name: Name,
parent_entity: String,
alias: Option<Positioned<Name>>,
fields: Vec<ParsedSelection>,
is_part_of_list: bool,
arguments: Vec<ParamType>,
entity_type: String,
},
List {
name: Name,
alias: Option<Positioned<Name>>,
node: Box<ParsedSelection>,
obj_type: String,
},
QueryRoot {
name: Name,
alias: Option<Positioned<Name>>,
fields: Vec<ParsedSelection>,
arguments: Vec<ParamType>,
kind: ParsedQueryKind,
root_entity_type: String,
},
PageInfo {
name: Name,
alias: Option<Positioned<Name>>,
fields: Vec<ParsedSelection>,
parent_entity: String,
},
Edge {
name: Name,
cursor: Box<Option<ParsedSelection>>,
node: Box<Option<ParsedSelection>>,
entity: String,
},
}

impl ParsedSelection {
/// Return name for a `ParsedSelection`.
pub fn name(&self) -> String {
match &self {
ParsedSelection::Scalar { name, .. } => name.to_string(),
ParsedSelection::Object { name, .. } => name.to_string(),
ParsedSelection::List { name, .. } => name.to_string(),
ParsedSelection::QueryRoot { name, .. } => name.to_string(),
ParsedSelection::PageInfo { name, .. } => name.to_string(),
ParsedSelection::Edge { name, .. } => name.to_string(),
}
}
}
Loading

0 comments on commit 4b55e97

Please sign in to comment.