diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a0e366bb..393628ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -179,6 +179,8 @@ jobs: - name: Install rust + caching uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + rustflags: "" - name: Set up sccache uses: mozilla-actions/sccache-action@v0.0.3 diff --git a/trustfall_stubgen/src/adapter_creator.rs b/trustfall_stubgen/src/adapter_creator.rs index 1ca8d88d..b03e6cc7 100644 --- a/trustfall_stubgen/src/adapter_creator.rs +++ b/trustfall_stubgen/src/adapter_creator.rs @@ -159,6 +159,8 @@ fn emit_property_handling( external_imports.insert(parse_import("trustfall::provider::ContextOutcomeIterator")); external_imports.insert(parse_import("trustfall::provider::ResolveInfo")); external_imports.insert(parse_import("trustfall::FieldValue")); + external_imports.insert(parse_import("trustfall::provider::Typename")); + external_imports.insert(parse_import("trustfall::provider::resolve_property_with")); quote! { fn resolve_property( @@ -168,6 +170,10 @@ fn emit_property_handling( property_name: &Arc, resolve_info: &ResolveInfo, ) -> ContextOutcomeIterator<'a, Self::Vertex, FieldValue> { + if property_name.as_ref() == "__typename" { + return resolve_property_with(contexts, |vertex| vertex.typename().into()); + } + match type_name.as_ref() { #arms _ => unreachable!("attempted to read property '{property_name}' on unexpected type: {type_name}"), diff --git a/trustfall_stubgen/test_data/expected_outputs/hackernews/adapter/adapter_impl.rs b/trustfall_stubgen/test_data/expected_outputs/hackernews/adapter/adapter_impl.rs index 6cb48002..81703256 100644 --- a/trustfall_stubgen/test_data/expected_outputs/hackernews/adapter/adapter_impl.rs +++ b/trustfall_stubgen/test_data/expected_outputs/hackernews/adapter/adapter_impl.rs @@ -1,6 +1,6 @@ use std::sync::{Arc, OnceLock}; -use trustfall::{FieldValue, Schema, provider::{ContextIterator, ContextOutcomeIterator, EdgeParameters, ResolveEdgeInfo, ResolveInfo, VertexIterator, resolve_coercion_using_schema}}; +use trustfall::{FieldValue, Schema, provider::{ContextIterator, ContextOutcomeIterator, EdgeParameters, ResolveEdgeInfo, ResolveInfo, Typename, VertexIterator, resolve_coercion_using_schema, resolve_property_with}}; use super::vertex::Vertex; @@ -171,6 +171,9 @@ impl<'a> trustfall::provider::Adapter<'a> for Adapter { property_name: &Arc, resolve_info: &ResolveInfo, ) -> ContextOutcomeIterator<'a, Self::Vertex, FieldValue> { + if property_name.as_ref() == "__typename" { + return resolve_property_with(contexts, |vertex| vertex.typename().into()); + } match type_name.as_ref() { "Comment" => { super::properties::resolve_comment_property( diff --git a/trustfall_stubgen/test_data/expected_outputs/use_reserved_rust_names_in_schema/adapter/adapter_impl.rs b/trustfall_stubgen/test_data/expected_outputs/use_reserved_rust_names_in_schema/adapter/adapter_impl.rs index c9116da9..7581adee 100644 --- a/trustfall_stubgen/test_data/expected_outputs/use_reserved_rust_names_in_schema/adapter/adapter_impl.rs +++ b/trustfall_stubgen/test_data/expected_outputs/use_reserved_rust_names_in_schema/adapter/adapter_impl.rs @@ -1,6 +1,6 @@ use std::sync::{Arc, OnceLock}; -use trustfall::{FieldValue, Schema, provider::{ContextIterator, ContextOutcomeIterator, EdgeParameters, ResolveEdgeInfo, ResolveInfo, VertexIterator, resolve_coercion_using_schema}}; +use trustfall::{FieldValue, Schema, provider::{ContextIterator, ContextOutcomeIterator, EdgeParameters, ResolveEdgeInfo, ResolveInfo, Typename, VertexIterator, resolve_coercion_using_schema, resolve_property_with}}; use super::vertex::Vertex; @@ -68,6 +68,9 @@ impl<'a> trustfall::provider::Adapter<'a> for Adapter { property_name: &Arc, resolve_info: &ResolveInfo, ) -> ContextOutcomeIterator<'a, Self::Vertex, FieldValue> { + if property_name.as_ref() == "__typename" { + return resolve_property_with(contexts, |vertex| vertex.typename().into()); + } match type_name.as_ref() { "const2" => { super::properties::resolve_const2_property(