Remove async-graphql-derive dependency on graphql-parser.

This commit is contained in:
sunli 2020-05-10 11:12:07 +08:00
parent f7d308be8a
commit 52170b6da3
5 changed files with 21 additions and 29 deletions

View File

@ -16,8 +16,8 @@ categories = ["network-programming", "asynchronous"]
proc-macro = true proc-macro = true
[dependencies] [dependencies]
async-graphql-parser = { path = "../async-graphql-parser", version = "0.1.0" }
proc-macro2 = "1.0.6" proc-macro2 = "1.0.6"
syn = { version = "1.0.13", features = ["full"] } syn = { version = "1.0.13", features = ["full"] }
quote = "1.0.3" quote = "1.0.3"
graphql-parser = "0.2.3"
Inflector = "0.11.4" Inflector = "0.11.4"

View File

@ -1,5 +1,5 @@
use crate::utils::{parse_guards, parse_validator, parse_value}; use crate::utils::{parse_guards, parse_validator};
use graphql_parser::query::Value; use async_graphql_parser::{parse_value, Value};
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use quote::quote; use quote::quote;
use syn::{Attribute, AttributeArgs, Error, Lit, Meta, MetaList, NestedMeta, Result, Type}; use syn::{Attribute, AttributeArgs, Error, Lit, Meta, MetaList, NestedMeta, Result, Type};

View File

@ -1,5 +1,4 @@
use graphql_parser::parse_query; use async_graphql_parser::Value;
use graphql_parser::query::{Definition, OperationDefinition, ParseError, Query, Value};
use proc_macro2::{Span, TokenStream}; use proc_macro2::{Span, TokenStream};
use quote::quote; use quote::quote;
use syn::{Error, Expr, Ident, Lit, Meta, MetaList, NestedMeta, Result}; use syn::{Error, Expr, Ident, Lit, Meta, MetaList, NestedMeta, Result};
@ -13,27 +12,11 @@ pub fn get_crate_name(internal: bool) -> TokenStream {
} }
} }
pub fn parse_value(s: &str) -> std::result::Result<Value, ParseError> {
let mut doc = parse_query(&format!("query ($a:Int!={}) {{ dummy }}", s))?;
let definition = doc.definitions.remove(0);
if let Definition::Operation(OperationDefinition::Query(Query {
mut variable_definitions,
..
})) = definition
{
let var = variable_definitions.remove(0);
Ok(var.default_value.unwrap())
} else {
unreachable!()
}
}
pub fn build_value_repr(crate_name: &TokenStream, value: &Value) -> TokenStream { pub fn build_value_repr(crate_name: &TokenStream, value: &Value) -> TokenStream {
match value { match value {
Value::Variable(_) => unreachable!(), Value::Variable(_) => unreachable!(),
Value::Int(n) => { Value::Int(n) => {
let n = n.as_i64().unwrap(); quote! { #crate_name::Value::Int(#n) }
quote! { #crate_name::Value::Int((#n as i32).into()) }
} }
Value::Float(n) => { Value::Float(n) => {
quote! { #crate_name::Value::Float(#n) } quote! { #crate_name::Value::Float(#n) }

View File

@ -4,10 +4,10 @@ extern crate pest_derive;
extern crate thiserror; extern crate thiserror;
pub mod ast; pub mod ast;
mod query_parser;
mod pos; mod pos;
mod query_parser;
mod value; mod value;
pub use query_parser::{parse_query, Error, Result};
pub use pos::{Pos, Positioned}; pub use pos::{Pos, Positioned};
pub use query_parser::{parse_query, parse_value, Error, Result};
pub use value::Value; pub use value::Value;

View File

@ -120,6 +120,15 @@ pub fn parse_query<T: AsRef<str>>(input: T) -> Result<Document> {
Ok(Document { definitions }) Ok(Document { definitions })
} }
/// Parse a graphql value
pub fn parse_value<T: AsRef<str>>(input: T) -> Result<Value> {
let value_pair: Pair<Rule> = QueryParser::parse(Rule::value, input.as_ref())?
.next()
.unwrap();
let mut pc = PositionCalculator::new(input.as_ref());
parse_value2(value_pair, &mut pc)
}
fn parse_named_operation_definition( fn parse_named_operation_definition(
pair: Pair<Rule>, pair: Pair<Rule>,
pc: &mut PositionCalculator, pc: &mut PositionCalculator,
@ -200,7 +209,7 @@ fn parse_named_operation_definition(
fn parse_default_value(pair: Pair<Rule>, pc: &mut PositionCalculator) -> Result<Value> { fn parse_default_value(pair: Pair<Rule>, pc: &mut PositionCalculator) -> Result<Value> {
for pair in pair.into_inner() { for pair in pair.into_inner() {
match pair.as_rule() { match pair.as_rule() {
Rule::value => return Ok(parse_value(pair, pc)?), Rule::value => return Ok(parse_value2(pair, pc)?),
_ => unreachable!(), _ => unreachable!(),
} }
} }
@ -313,7 +322,7 @@ fn parse_variable(pair: Pair<Rule>, pc: &mut PositionCalculator) -> Result<Posit
unreachable!() unreachable!()
} }
fn parse_value(pair: Pair<Rule>, pc: &mut PositionCalculator) -> Result<Value> { fn parse_value2(pair: Pair<Rule>, pc: &mut PositionCalculator) -> Result<Value> {
let pair = pair.into_inner().next().unwrap(); let pair = pair.into_inner().next().unwrap();
Ok(match pair.as_rule() { Ok(match pair.as_rule() {
Rule::object => parse_object_value(pair, pc)?, Rule::object => parse_object_value(pair, pc)?,
@ -348,7 +357,7 @@ fn parse_object_pair(pair: Pair<Rule>, pc: &mut PositionCalculator) -> Result<(S
for pair in pair.into_inner() { for pair in pair.into_inner() {
match pair.as_rule() { match pair.as_rule() {
Rule::name => name = Some(pair.as_str().to_string()), Rule::name => name = Some(pair.as_str().to_string()),
Rule::value => value = Some(parse_value(pair, pc)?), Rule::value => value = Some(parse_value2(pair, pc)?),
_ => unreachable!(), _ => unreachable!(),
} }
} }
@ -373,7 +382,7 @@ fn parse_array_value(pair: Pair<Rule>, pc: &mut PositionCalculator) -> Result<Va
for pair in pair.into_inner() { for pair in pair.into_inner() {
match pair.as_rule() { match pair.as_rule() {
Rule::value => { Rule::value => {
array.push(parse_value(pair, pc)?); array.push(parse_value2(pair, pc)?);
} }
_ => unreachable!(), _ => unreachable!(),
} }
@ -393,7 +402,7 @@ fn parse_pair(
Rule::value => { Rule::value => {
value = { value = {
let pos = pc.step(&pair); let pos = pc.step(&pair);
Some(Positioned::new(parse_value(pair, pc)?, pos)) Some(Positioned::new(parse_value2(pair, pc)?, pos))
} }
} }
_ => unreachable!(), _ => unreachable!(),