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 编程语言
14,424 个月下载量
在 18 个crate(9个直接使用)中使用
325KB
9K SLoC
特性
- 符合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()]
);
}
}
许可证
许可方式为以下之一
- Apache许可证,版本2.0(LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》 或 https://opensource.org/licenses/MIT)
由您选择。
依赖项
~1–1.8MB
~34K SLoC