Fix #322.
This commit is contained in:
parent
ec4aba62ec
commit
80d6ec05dd
|
@ -47,8 +47,8 @@ object_type = {
|
||||||
implements_interfaces = { "implements" ~ "&"? ~ name ~ ("&" ~ name)* }
|
implements_interfaces = { "implements" ~ "&"? ~ name ~ ("&" ~ name)* }
|
||||||
|
|
||||||
interface_type = {
|
interface_type = {
|
||||||
string? ~ "interface" ~ name ~ const_directives? ~ fields_definition?
|
string? ~ "interface" ~ name ~ implements_interfaces? ~ const_directives? ~ fields_definition?
|
||||||
| extend ~ "interface" ~ name ~ (const_directives? ~ fields_definition | const_directives)
|
| extend ~ "interface" ~ name ~ implements_interfaces? ~ (const_directives? ~ fields_definition | const_directives)
|
||||||
}
|
}
|
||||||
|
|
||||||
fields_definition = { "{" ~ field_definition+ ~ "}" }
|
fields_definition = { "{" ~ field_definition+ ~ "}" }
|
||||||
|
|
|
@ -149,12 +149,26 @@ fn parse_type_definition(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Rule::interface_type => {
|
Rule::interface_type => {
|
||||||
|
let implements = parse_if_rule(&mut pairs, Rule::implements_interfaces, |pair| {
|
||||||
|
debug_assert_eq!(pair.as_rule(), Rule::implements_interfaces);
|
||||||
|
|
||||||
|
pair.into_inner()
|
||||||
|
.map(|pair| parse_name(pair, pc))
|
||||||
|
.collect::<Result<_>>()
|
||||||
|
})?;
|
||||||
|
|
||||||
let directives = parse_opt_const_directives(&mut pairs, pc)?;
|
let directives = parse_opt_const_directives(&mut pairs, pc)?;
|
||||||
let fields = parse_if_rule(&mut pairs, Rule::fields_definition, |pair| {
|
let fields = parse_if_rule(&mut pairs, Rule::fields_definition, |pair| {
|
||||||
parse_fields_definition(pair, pc)
|
parse_fields_definition(pair, pc)
|
||||||
})?
|
})?
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
(directives, TypeKind::Interface(InterfaceType { fields }))
|
(
|
||||||
|
directives,
|
||||||
|
TypeKind::Interface(InterfaceType {
|
||||||
|
implements: implements.unwrap_or_default(),
|
||||||
|
fields,
|
||||||
|
}),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
Rule::union_type => {
|
Rule::union_type => {
|
||||||
let directives = parse_opt_const_directives(&mut pairs, pc)?;
|
let directives = parse_opt_const_directives(&mut pairs, pc)?;
|
||||||
|
|
|
@ -112,6 +112,8 @@ pub struct FieldDefinition {
|
||||||
/// [Reference](https://spec.graphql.org/June2018/#InterfaceType).
|
/// [Reference](https://spec.graphql.org/June2018/#InterfaceType).
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct InterfaceType {
|
pub struct InterfaceType {
|
||||||
|
/// The interfaces implemented by the interface.
|
||||||
|
pub implements: Vec<Positioned<Name>>,
|
||||||
/// The fields of the interface type.
|
/// The fields of the interface type.
|
||||||
pub fields: Vec<Positioned<FieldDefinition>>,
|
pub fields: Vec<Positioned<FieldDefinition>>,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
type Type1 implements IOne
|
type Type1 implements IOne
|
||||||
|
|
||||||
type Type1 implements IOne & ITwo
|
type Type1 implements IOne & ITwo
|
||||||
|
|
||||||
|
interface Type1 implements IOne
|
||||||
|
|
||||||
|
interface Type1 implements IOne & ITwo
|
||||||
|
|
Loading…
Reference in New Issue
Block a user