Skip to content

Commit 920ff5b

Browse files
committed
Make things compile
1 parent ed33dea commit 920ff5b

File tree

4 files changed

+52
-26
lines changed

4 files changed

+52
-26
lines changed

crates/apollo-smith/src/next/ast/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,13 @@ impl DefinitionHasFields for Definition {
106106
}
107107
}
108108

109-
fn fields_mut(&mut self) -> &mut Vec<Node<FieldDefinition>> {
109+
fn fields_mut<'a>(&mut self) -> &mut Vec<Node<FieldDefinition>> {
110110
match self {
111-
Definition::ObjectTypeDefinition(d) => &mut d.fields,
112-
Definition::InterfaceTypeDefinition(d) => &mut d.fields,
111+
Definition::ObjectTypeDefinition(d) => d.make_mut().fields_mut(),
112+
Definition::InterfaceTypeDefinition(d) => d.make_mut().fields_mut(),
113113
_ => panic!("fields_mut cannot be called on a definition that has no fields"),
114114
}
115115
}
116116
}
117+
118+

crates/apollo-smith/src/next/schema/mod.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
use std::sync::OnceLock;
12
use apollo_compiler::ast::{FieldDefinition, Name};
23
use apollo_compiler::schema::{Component, ExtendedType, InterfaceType, ObjectType};
3-
use apollo_compiler::Node;
44
use indexmap::IndexMap;
5+
use crate::next::Unstructured;
56

67
pub(crate) mod extended_type;
78

@@ -72,9 +73,10 @@ field_access!(InterfaceType);
7273

7374
pub(crate) trait TypeHasFields {
7475
fn fields(&self) -> &IndexMap<Name, Component<FieldDefinition>>;
75-
fn random_field(&self, u:) -> Option<&Node<FieldDefinition>> {
76-
let mut fields = self.fields().values().collect::<Vec<_>>();
77-
fields.c()
76+
fn random_field(&self, u: &mut Unstructured) -> arbitrary::Result<&Component<FieldDefinition>> {
77+
// Types always have at least one field
78+
let fields = self.fields().values().collect::<Vec<_>>();
79+
Ok(fields[u.choose_index(fields.len())?])
7880
}
7981

8082
}
@@ -93,11 +95,11 @@ impl TypeHasFields for InterfaceType {
9395

9496
impl TypeHasFields for ExtendedType {
9597
fn fields(&self) -> &IndexMap<Name, Component<FieldDefinition>> {
96-
static EMPTY: IndexMap<Name, Component<FieldDefinition>> = IndexMap::new();
98+
static EMPTY: OnceLock<IndexMap<Name, Component<FieldDefinition>>> = OnceLock::new();
9799
match self {
98100
ExtendedType::Object(t) => t.fields(),
99101
ExtendedType::Interface(t) => t.fields(),
100-
_ => &EMPTY,
102+
_ => &EMPTY.get_or_init(||Default::default()),
101103
}
102104
}
103105
}

crates/apollo-smith/src/next/schema/schema.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use apollo_compiler::ast::OperationType;
21
use arbitrary::Unstructured;
32
use paste::paste;
43

crates/apollo-smith/src/next/unstructured.rs

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@ use apollo_compiler::ast::{
99
OperationType, SchemaDefinition, Selection, Type, UnionTypeDefinition, Value,
1010
VariableDefinition,
1111
};
12-
use apollo_compiler::schema::{ExtendedType, InterfaceType, ObjectType};
12+
use apollo_compiler::schema::{ExtendedType, InterfaceType, };
1313
use apollo_compiler::{Node, NodeStr, Schema};
1414

1515
use crate::next::ast::directive_definition::DirectiveDefinitionIterExt;
16-
use crate::next::ast::DefinitionHasFields;
1716
use crate::next::schema::extended_type::{ExtendedTypeExt, ExtendedTypeKind};
1817
use crate::next::schema::object_type::ObjectTypeExt;
1918
use crate::next::schema::schema::SchemaExt;
@@ -461,9 +460,9 @@ impl Unstructured<'_> {
461460
.ty(self)?;
462461
Ok(VariableDefinition {
463462
name: self.unique_name(),
464-
ty: Node::new(ty),
465463
default_value: self
466464
.arbitrary_optional(|u| Ok(Node::new(u.arbitrary_value(schema, &ty)?)))?,
465+
ty: Node::new(ty),
467466
directives: schema
468467
.sample_directives(self)?
469468
.into_iter()
@@ -479,7 +478,7 @@ impl Unstructured<'_> {
479478
)?;
480479

481480
Ok(InlineFragment {
482-
type_condition: self.arbitrary_optional(|u| Ok(ty.name().clone()))?,
481+
type_condition: self.arbitrary_optional(|_| Ok(ty.name().clone()))?,
483482
directives: schema
484483
.sample_directives(self)?
485484
.into_iter()
@@ -503,20 +502,44 @@ impl Unstructured<'_> {
503502
fn arbitrary_selection(
504503
&mut self,
505504
schema: &Schema,
506-
object_type: &dyn super::schema::TypeHasFields,
505+
ty: &dyn super::schema::TypeHasFields,
507506
) -> Result<Selection> {
508-
if let Some(field) = object_type.random_field(self)? {
509-
match self.choose_index(3) {
510-
Ok(0) => Ok(Selection::Field(Node::new(self.arbitrary_field(schema)?))),
511-
Ok(1) => Ok(Selection::FragmentSpread(Node::new(
512-
self.arbitrary_fragment_spread(schema)?,
513-
))),
514-
Ok(2) => Ok(Selection::InlineFragment(Node::new(
515-
self.arbitrary_inline_fragment(schema)?,
516-
))),
517-
_ => unreachable!(),
518-
}
507+
match self.choose_index(3) {
508+
Ok(0) => {
509+
let field = ty.random_field(self)?;
510+
let field_ty = schema.types.get(field.ty.inner_named_type()).expect("type must exist");
511+
let selection_set = if field_ty.is_object() || field_ty.is_interface() {
512+
self.arbitrary_vec(0, 5, |u| {
513+
Ok(u.arbitrary_selection(schema, field_ty)?)
514+
})?
515+
} else {
516+
vec![]
517+
};
518+
Ok(Selection::Field(Node::new(Field {
519+
alias: self.arbitrary_optional(|u|Ok(u.unique_name()))?,
520+
name: self.unique_name(),
521+
arguments: self.arbitrary_vec(0, 5, |u| {
522+
Ok(Node::new(Argument {
523+
name: u.unique_name(),
524+
value: Node::new(u.arbitrary_value(schema, &field.ty)?),
525+
}))
526+
})?,
527+
directives: schema.sample_directives(self)?
528+
.into_iter()
529+
.with_location(DirectiveLocation::Field)
530+
.try_collect(self, schema)?,
531+
selection_set,
532+
})))
533+
},
534+
Ok(1) => Ok(Selection::FragmentSpread(Node::new(
535+
self.arbitrary_fragment_spread(schema)?,
536+
))),
537+
Ok(2) => Ok(Selection::InlineFragment(Node::new(
538+
self.arbitrary_inline_fragment(schema)?,
539+
))),
540+
_ => unreachable!(),
519541
}
542+
520543
}
521544
}
522545

0 commit comments

Comments
 (0)