Skip to content

Commit

Permalink
Generate more edge-handling code in trustfall_stubgen. (#352)
Browse files Browse the repository at this point in the history
Fixes #346.
  • Loading branch information
obi1kenobi committed Jul 7, 2023
1 parent ede029e commit 4d47a2d
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 17 deletions.
15 changes: 12 additions & 3 deletions trustfall_stubgen/src/edges_creator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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)
})
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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'")
},
)
}
}

Expand All @@ -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;
Expand All @@ -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'")
},
)
}
}

Expand All @@ -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;
Expand All @@ -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'")
},
)
}
}

Expand All @@ -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;
Expand All @@ -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'")
},
)
}
}

0 comments on commit 4d47a2d

Please sign in to comment.