use super::*;
use crate::filter::{BaseFilter, Filter, RelationFilter, RootWhere};
pub trait DerivedMap<I, T> {
type Output: Sized;
type Transformer: Transformer;
fn derived_entity_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
end_block: Option<<<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter;
fn derived_event_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter;
}
impl<I, S: Transformer, T: Transformer> DerivedMap<&I, T> for S
where
I: Send + Sync + Borrow<<S as Identifiable>::Id> + core::fmt::Debug,
<T as Identifiable>::Id: ToDbFilter,
{
type Output = Option<T::GraphqlOutput>;
type Transformer = T;
fn derived_entity_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
_end_block: Option<<<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter
{
let cmp = BaseFilter::from(id.borrow());
async move {
fetch_optional_by_blocknumber_helper::<_, S, Self::Transformer, _>(
ctx,
id,
cmp,
block_number,
builder,
field,
)
.await
}
.boxed()
}
fn derived_event_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter
{
let cmp = BaseFilter::from(id.borrow());
async move {
fetch_optional_by_blocknumber_helper::<_, S, Self::Transformer, _>(
ctx,
id,
cmp,
block_number,
builder,
field,
)
.await
}
.boxed()
}
}
impl<I, S: Transformer, T: Transformer> DerivedMap<&I, Option<T>> for S
where
I: Send + Sync + Borrow<<S as Identifiable>::Id> + core::fmt::Debug,
<T as Identifiable>::Id: ToDbFilter,
{
type Output = Option<T::GraphqlOutput>;
type Transformer = T;
fn derived_entity_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
end_block: Option<<<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter
{
<Self as DerivedMap<&I, T>>::derived_entity_map(
ctx,
id,
block_number,
end_block,
builder,
field,
)
}
fn derived_event_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter
{
<Self as DerivedMap<&I, T>>::derived_event_map(ctx, id, block_number, builder, field)
}
}
impl<I, S: Transformer, T: Transformer> DerivedMap<&I, Vec<T>> for S
where
I: Send + Sync + Borrow<<S as Identifiable>::Id> + core::fmt::Debug,
<T as Identifiable>::Id: ToDbFilter,
{
type Output = Vec<T::GraphqlOutput>;
type Transformer = T;
fn derived_entity_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
_end_block: Option<<<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter
{
let cmp = BaseFilter::from(id.borrow());
async move {
fetch_collection_by_blocknumber_helper::<S, Self::Transformer, _>(
ctx,
cmp,
block_number,
builder,
field,
)
.await
}
.boxed()
}
fn derived_event_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter
{
let cmp = BaseFilter::from(id.borrow());
async move {
fetch_collection_by_blocknumber_helper::<S, Self::Transformer, _>(
ctx,
cmp,
block_number,
builder,
field,
)
.await
}
.boxed()
}
}
impl<I, S: Transformer, T: Transformer> DerivedMap<&I, T> for Vec<S>
where
I: Send + Sync + Borrow<<S as Identifiable>::Id> + core::fmt::Debug,
<T as Identifiable>::Id: ToDbFilter,
{
type Output = Option<T::GraphqlOutput>;
type Transformer = T;
fn derived_entity_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
_end_block: Option<<<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter
{
let cmp = RelationFilter {
contains: Some(id.borrow()),
};
async move {
fetch_optional_by_blocknumber_helper::<_, S, Self::Transformer, _>(
ctx,
id,
cmp,
block_number,
builder,
field,
)
.await
}
.boxed()
}
fn derived_event_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter
{
let cmp = RelationFilter {
contains: Some(id.borrow()),
};
async move {
fetch_optional_by_blocknumber_helper::<_, S, Self::Transformer, _>(
ctx,
id,
cmp,
block_number,
builder,
field,
)
.await
}
.boxed()
}
}
impl<I, S: Transformer, T: Transformer> DerivedMap<&I, Vec<T>> for Vec<S>
where
I: Send + Sync + Borrow<<S as Identifiable>::Id> + core::fmt::Debug,
<T as Identifiable>::Id: ToDbFilter,
{
type Output = Vec<T::GraphqlOutput>;
type Transformer = T;
fn derived_entity_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
_end_block: Option<<<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter
{
let cmp = RelationFilter {
contains: Some(id.borrow()),
};
async move {
fetch_collection_by_blocknumber_helper::<S, Self::Transformer, _>(
ctx,
cmp,
block_number,
builder,
field,
)
.await
}
.boxed()
}
fn derived_event_map<'b: 'a, 'a, 'ctx>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
block_number: <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
builder: GraphqlQueryBuilder<Self::Transformer>,
field: &'static ColDescription,
) -> BoxFuture<'a, async_graphql::Result<Self::Output>>
where
I: 'b + Send,
<<Self::Transformer as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<IdFilter = <<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter, BlockNumber = <<<Self::Transformer as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber>,
<Self::Transformer as Identifiable>::Id: ToDbFilter,
<<Self::Transformer as Identifiable>::Id as ToDbFilter>::Filter: Filter
{
let cmp = RelationFilter {
contains: Some(id.borrow()),
};
async move {
fetch_collection_by_blocknumber_helper::<S, Self::Transformer, _>(
ctx,
cmp,
block_number,
builder,
field,
)
.await
}
.boxed()
}
}
#[cido_macros::_impls]
async fn fetch_collection_by_blocknumber_helper<'b: 'a, 'a, 'ctx, S, T, M>(
ctx: &'a async_graphql::Context<'ctx>,
cmp: M,
block_number: <<T::Cidomap as Cidomap>::Network as Network>::BlockNumber,
builder: GraphqlQueryBuilder<T>,
field: &'static ColDescription,
) -> async_graphql::Result<Vec<T::GraphqlOutput>>
where
M: Filter,
M::Primitive: for<'e> sqlx::Encode<'e, sqlx::Postgres> + sqlx::Type<sqlx::Postgres> + Send + Sync,
S: Transformer,
T: Transformer,
<<T as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<
BlockNumber = <<<T as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
IdFilter = <<T as Identifiable>::Id as ToDbFilter>::Filter,
>,
<T as Identifiable>::Id: ToDbFilter,
<<T as Identifiable>::Id as ToDbFilter>::Filter: Filter,
{
unimplemented!()
}
#[cido_macros::_impls]
async fn fetch_optional_by_blocknumber_helper<'b: 'a, 'a, 'ctx, I, S, T, M>(
ctx: &'a async_graphql::Context<'ctx>,
id: &'b I,
cmp: M,
block_number: <<T::Cidomap as Cidomap>::Network as Network>::BlockNumber,
builder: GraphqlQueryBuilder<T>,
field: &'static ColDescription,
) -> async_graphql::Result<Option<T::GraphqlOutput>>
where
I: core::fmt::Debug,
M: Filter,
M::Primitive: for<'e> sqlx::Encode<'e, sqlx::Postgres> + sqlx::Type<sqlx::Postgres> + Send + Sync,
S: Transformer,
T: Transformer,
<<T as Transformer>::GraphqlInput as GraphqlInputType>::Where: RootWhere<
BlockNumber = <<<T as Transformer>::Cidomap as Cidomap>::Network as Network>::BlockNumber,
IdFilter = <<T as Identifiable>::Id as ToDbFilter>::Filter,
>,
<T as Identifiable>::Id: ToDbFilter,
<<T as Identifiable>::Id as ToDbFilter>::Filter: Filter,
{
unimplemented!()
}