36个版本

0.8.1 2024年8月20日
0.8.0 2024年7月31日
0.7.7 2024年4月8日
0.7.6 2024年2月14日
0.1.0 2021年11月24日

#6 in 编程语言

Download history 2909/week @ 2024-05-03 2626/week @ 2024-05-10 2915/week @ 2024-05-17 2888/week @ 2024-05-24 3343/week @ 2024-05-31 3609/week @ 2024-06-07 3767/week @ 2024-06-14 3601/week @ 2024-06-21 2710/week @ 2024-06-28 2637/week @ 2024-07-05 2798/week @ 2024-07-12 3325/week @ 2024-07-19 3279/week @ 2024-07-26 3594/week @ 2024-08-02 3263/week @ 2024-08-09 3794/week @ 2024-08-16

14,424 个月下载量
18 个crate(9个直接使用)中使用

MIT/Apache

325KB
9K SLoC

apollo-parser

GraphQL语言的解析器。

Crates.io version Download docs.rs docs

特性

  • 符合2021年10月规范的类型化GraphQL具体语法树
  • 错误容错性
    • 如果发现词法或语法错误,则词法分析和解析不会失败或 panic
  • GraphQL词法分析器
  • GraphQL解析器

入门

添加依赖项以开始使用 apollo-parser

cargo add apollo-parser

或者将其添加到您的 Cargo.toml 以进行手动安装

# Just an example, change to the necessary package version.
[dependencies]
apollo-parser = "0.8.1"

Rust版本

apollo-parser 在Rust的最新稳定版上进行了测试。旧版本可能兼容或不兼容。

用法

apollo-parser 被构建为根据最新的 2021年10月规范 解析GraphQL模式和查询。它生成一个类型化语法树,然后可以遍历,提取所有必要的信息。您可以快速开始使用

use apollo_parser::Parser;

let input = "union SearchResult = Photo | Person | Cat | Dog";
let parser = Parser::new(input);
let cst = parser.parse();

apollo-parser 被构建为具有错误容错性。这意味着如果发生错误,我们不会中断解析(或词法分析)。这意味着 parser.parse() 将始终生成CST(具体语法树),并伴随遇到的所有错误

use apollo_parser::Parser;

let input = "union SearchResult = Photo | Person | Cat | Dog";
let parser = Parser::new(input);
let cst = parser.parse();

// cst.errors() returns an iterator with the errors encountered during lexing and parsing
assert_eq!(0, cst.errors().len());

// cst.document() gets the Document, or root node, of the tree that you can
// start iterating on.
let doc = cst.document();

示例

以下概述了两个示例

此仓库中的 示例目录 包含一些其他有用的实现,例如

获取对象中的字段名称

use apollo_parser::{cst, Parser};

let input = "
type ProductDimension {
  size: String
  weight: Float @tag(name: \"hi from inventory value type field\")
}
";
let parser = Parser::new(input);
let cst = parser.parse();
assert_eq!(0, cst.errors().len());

let doc = cst.document();

for def in doc.definitions() {
    if let cst::Definition::ObjectTypeDefinition(object_type) = def {
        assert_eq!(object_type.name().unwrap().text(), "ProductDimension");
        for field_def in object_type.fields_definition().unwrap().field_definitions() {
            println!("{}", field_def.name().unwrap().text()); // size weight
        }
    }
}

获取查询中使用的变量

use apollo_parser::{cst, Parser};

let input = "
  query GraphQuery($graph_id: ID!, $variant: String) {
    service(id: $graph_id) {
      schema(tag: $variant) {
        document
      }
    }
  }
  ";

  let parser = Parser::new(input);
  let cst = parser.parse();
  assert_eq!(0, cst.errors().len());

  let doc = cst.document();

  for def in doc.definitions() {
      if let cst::Definition::OperationDefinition(op_def) = def {
          assert_eq!(op_def.name().unwrap().text(), "GraphQuery");

          let variable_defs = op_def.variable_definitions();
          let variables: Vec<String> = variable_defs
              .iter()
              .map(|v| v.variable_definitions())
              .flatten()
              .filter_map(|v| Some(v.variable()?.text().to_string()))
              .collect();
          assert_eq!(
              variables.as_slice(),
              ["graph_id".to_string(), "variant".to_string()]
          );
      }
  }

许可证

许可方式为以下之一

由您选择。

依赖项

~1–1.8MB
~34K SLoC