diff --git a/trustfall_stubgen/src/edges_creator.rs b/trustfall_stubgen/src/edges_creator.rs index e185ffba..826c11ca 100644 --- a/trustfall_stubgen/src/edges_creator.rs +++ b/trustfall_stubgen/src/edges_creator.rs @@ -127,7 +127,10 @@ fn make_type_edge_resolver( let type_edge_mod = quote! { mod #mod_name { - use trustfall::provider::{ContextIterator, ContextOutcomeIterator, ResolveEdgeInfo, VertexIterator}; + use trustfall::provider::{ + resolve_neighbors_with, ContextIterator, ContextOutcomeIterator, ResolveEdgeInfo, + VertexIterator, + }; use super::super::vertex::Vertex; @@ -154,14 +157,20 @@ fn make_edge_resolver_and_call( let resolver_fn_name = to_lower_snake_case(edge_name); let resolver_fn_ident = syn::Ident::new(&resolver_fn_name, proc_macro2::Span::call_site()); - let todo_msg = format!("implement edge '{edge_name}' for type '{type_name}'"); + let conversion_fn_name = format!("as_{}", to_lower_snake_case(type_name)); + let conversion_fn_ident = syn::Ident::new(&conversion_fn_name, proc_macro2::Span::call_site()); + let expect_msg = format!("conversion failed, vertex was not a {type_name}"); + let todo_msg = format!("get neighbors along edge '{edge_name}' for type '{type_name}'"); let resolver = quote! { pub(super) fn #resolver_fn_ident<'a>( contexts: ContextIterator<'a, Vertex>, #fn_params _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!(#todo_msg) + resolve_neighbors_with(contexts, |vertex| { + let vertex = vertex.#conversion_fn_ident().expect(#expect_msg); + todo!(#todo_msg) + }) } }; diff --git a/trustfall_stubgen/test_data/expected_outputs/hackernews/adapter/edges.rs b/trustfall_stubgen/test_data/expected_outputs/hackernews/adapter/edges.rs index 6014a213..6dded56d 100644 --- a/trustfall_stubgen/test_data/expected_outputs/hackernews/adapter/edges.rs +++ b/trustfall_stubgen/test_data/expected_outputs/hackernews/adapter/edges.rs @@ -23,7 +23,8 @@ pub(super) fn resolve_comment_edge<'a>( mod comment { use trustfall::provider::{ - ContextIterator, ContextOutcomeIterator, ResolveEdgeInfo, VertexIterator, + resolve_neighbors_with, ContextIterator, ContextOutcomeIterator, ResolveEdgeInfo, + VertexIterator, }; use super::super::vertex::Vertex; @@ -32,28 +33,60 @@ mod comment { contexts: ContextIterator<'a, Vertex>, _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!("implement edge 'byUser' for type 'Comment'") + resolve_neighbors_with( + contexts, + |vertex| { + let vertex = vertex + .as_comment() + .expect("conversion failed, vertex was not a Comment"); + todo!("get neighbors along edge 'byUser' for type 'Comment'") + }, + ) } pub(super) fn link<'a>( contexts: ContextIterator<'a, Vertex>, _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!("implement edge 'link' for type 'Comment'") + resolve_neighbors_with( + contexts, + |vertex| { + let vertex = vertex + .as_comment() + .expect("conversion failed, vertex was not a Comment"); + todo!("get neighbors along edge 'link' for type 'Comment'") + }, + ) } pub(super) fn parent<'a>( contexts: ContextIterator<'a, Vertex>, _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!("implement edge 'parent' for type 'Comment'") + resolve_neighbors_with( + contexts, + |vertex| { + let vertex = vertex + .as_comment() + .expect("conversion failed, vertex was not a Comment"); + todo!("get neighbors along edge 'parent' for type 'Comment'") + }, + ) } pub(super) fn reply<'a>( contexts: ContextIterator<'a, Vertex>, _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!("implement edge 'reply' for type 'Comment'") + resolve_neighbors_with( + contexts, + |vertex| { + let vertex = vertex + .as_comment() + .expect("conversion failed, vertex was not a Comment"); + todo!("get neighbors along edge 'reply' for type 'Comment'") + }, + ) } } @@ -75,7 +108,8 @@ pub(super) fn resolve_job_edge<'a>( mod job { use trustfall::provider::{ - ContextIterator, ContextOutcomeIterator, ResolveEdgeInfo, VertexIterator, + resolve_neighbors_with, ContextIterator, ContextOutcomeIterator, ResolveEdgeInfo, + VertexIterator, }; use super::super::vertex::Vertex; @@ -84,7 +118,15 @@ mod job { contexts: ContextIterator<'a, Vertex>, _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!("implement edge 'link' for type 'Job'") + resolve_neighbors_with( + contexts, + |vertex| { + let vertex = vertex + .as_job() + .expect("conversion failed, vertex was not a Job"); + todo!("get neighbors along edge 'link' for type 'Job'") + }, + ) } } @@ -108,7 +150,8 @@ pub(super) fn resolve_story_edge<'a>( mod story { use trustfall::provider::{ - ContextIterator, ContextOutcomeIterator, ResolveEdgeInfo, VertexIterator, + resolve_neighbors_with, ContextIterator, ContextOutcomeIterator, ResolveEdgeInfo, + VertexIterator, }; use super::super::vertex::Vertex; @@ -117,21 +160,45 @@ mod story { contexts: ContextIterator<'a, Vertex>, _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!("implement edge 'byUser' for type 'Story'") + resolve_neighbors_with( + contexts, + |vertex| { + let vertex = vertex + .as_story() + .expect("conversion failed, vertex was not a Story"); + todo!("get neighbors along edge 'byUser' for type 'Story'") + }, + ) } pub(super) fn comment<'a>( contexts: ContextIterator<'a, Vertex>, _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!("implement edge 'comment' for type 'Story'") + resolve_neighbors_with( + contexts, + |vertex| { + let vertex = vertex + .as_story() + .expect("conversion failed, vertex was not a Story"); + todo!("get neighbors along edge 'comment' for type 'Story'") + }, + ) } pub(super) fn link<'a>( contexts: ContextIterator<'a, Vertex>, _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!("implement edge 'link' for type 'Story'") + resolve_neighbors_with( + contexts, + |vertex| { + let vertex = vertex + .as_story() + .expect("conversion failed, vertex was not a Story"); + todo!("get neighbors along edge 'link' for type 'Story'") + }, + ) } } @@ -154,7 +221,8 @@ pub(super) fn resolve_user_edge<'a>( mod user { use trustfall::provider::{ - ContextIterator, ContextOutcomeIterator, ResolveEdgeInfo, VertexIterator, + resolve_neighbors_with, ContextIterator, ContextOutcomeIterator, ResolveEdgeInfo, + VertexIterator, }; use super::super::vertex::Vertex; @@ -163,13 +231,29 @@ mod user { contexts: ContextIterator<'a, Vertex>, _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!("implement edge 'link' for type 'User'") + resolve_neighbors_with( + contexts, + |vertex| { + let vertex = vertex + .as_user() + .expect("conversion failed, vertex was not a User"); + todo!("get neighbors along edge 'link' for type 'User'") + }, + ) } pub(super) fn submitted<'a>( contexts: ContextIterator<'a, Vertex>, _resolve_info: &ResolveEdgeInfo, ) -> ContextOutcomeIterator<'a, Vertex, VertexIterator<'a, Vertex>> { - todo!("implement edge 'submitted' for type 'User'") + resolve_neighbors_with( + contexts, + |vertex| { + let vertex = vertex + .as_user() + .expect("conversion failed, vertex was not a User"); + todo!("get neighbors along edge 'submitted' for type 'User'") + }, + ) } }