-
-
Notifications
You must be signed in to change notification settings - Fork 55
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
wip: working types but runtime partially put together
- Loading branch information
1 parent
773c9bd
commit 5e87606
Showing
11 changed files
with
192 additions
and
319 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,4 @@ | ||
// This file was generated by [rspc](https://github.com/oscartbeaumont/rspc). Do not edit this file manually. | ||
export type Procedures = { queries: { key: "X-Demo-Header"; input: never; result: null; error: null } | { key: "echo"; input: string; result: null; error: null } | { key: "echo2"; input: string; result: null; error: null } | { key: "error"; input: never; result: null; error: null } | { key: "transformMe"; input: never; result: null; error: null }; mutations: { key: "error"; input: never; result: null; error: null } | { key: "sendMsg"; input: string; result: null; error: null }; subscriptions: never } | ||
export type Procedures = { queries: { key: "X-Demo-Header"; input: never; result: string; error: Error } | { key: "echo"; input: string; result: string; error: Error } | { key: "echo2"; input: string; result: string; error: Error } | { key: "error"; input: never; result: string; error: Error } | { key: "transformMe"; input: never; result: string; error: Error }; mutations: { key: "error"; input: never; result: string; error: Error } | { key: "sendMsg"; input: string; result: string; error: Error }; subscriptions: never } | ||
|
||
export type Error = string |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,98 +1,77 @@ | ||
use std::marker::PhantomData; | ||
use std::{ | ||
future::{ready, Ready}, | ||
marker::PhantomData, | ||
}; | ||
|
||
use serde::de::DeserializeOwned; | ||
use specta::Type; | ||
|
||
mod private { | ||
use std::borrow::Cow; | ||
|
||
use futures::Stream; | ||
use serde::Serialize; | ||
use serde_json::Value; | ||
use specta::{ts::TsExportError, TypeMap}; | ||
|
||
use crate::{ | ||
internal::{ | ||
middleware::{ProcedureKind, RequestContext}, | ||
procedure::ProcedureDef, | ||
resolver::IntoQueryMutationResponse, | ||
}, | ||
IntoResolverError, | ||
}; | ||
|
||
use super::*; | ||
|
||
/// TODO | ||
pub trait ResolverFunction<TLCtx>: Send + Sync + 'static { | ||
// TODO: How da hell if this needs to be dyn-safe. It needs to end up boxed too, basically but then that prevents boxing anything refering to it | ||
// type Stream<'a>: Body + Send + 'a; | ||
|
||
fn into_procedure_def( | ||
&self, | ||
key: Cow<'static, str>, | ||
ty_store: &mut TypeMap, | ||
) -> Result<ProcedureDef, TsExportError>; | ||
|
||
// TODO: The return type can't be `Value` cause streams and stuff | ||
fn exec(&self, ctx: TLCtx, input: Value, req: RequestContext) -> Value; | ||
} | ||
|
||
// TODO: Allow transforming into a boxed variant of the function | ||
|
||
// TODO: Rename `Resolver`? | ||
pub struct HasResolver<F, TResult, M> { | ||
resolver: F, | ||
pub(crate) kind: ProcedureKind, | ||
phantom: PhantomData<fn() -> (TResult, M)>, | ||
} | ||
use std::borrow::Cow; | ||
|
||
use serde::Serialize; | ||
use serde_json::Value; | ||
use specta::{ts::TsExportError, TypeMap}; | ||
|
||
use crate::{ | ||
internal::{ | ||
middleware::{ProcedureKind, RequestContext}, | ||
procedure::ProcedureDef, | ||
resolver::IntoQueryMutationResponse, | ||
Layer, Once, | ||
}, | ||
ExecError, IntoResolverError, | ||
}; | ||
|
||
// TODO: Rename `Resolver`? | ||
pub struct HasResolver<F, TErr, M> { | ||
resolver: F, | ||
pub(crate) kind: ProcedureKind, | ||
phantom: PhantomData<fn() -> (TErr, M)>, | ||
} | ||
|
||
impl<F, TResult, M> HasResolver<F, TResult, M> { | ||
pub(crate) fn new(resolver: F, kind: ProcedureKind) -> Self { | ||
Self { | ||
resolver, | ||
kind, | ||
phantom: PhantomData, | ||
} | ||
impl<F, E, M> HasResolver<F, E, M> { | ||
pub(crate) fn new(resolver: F, kind: ProcedureKind) -> Self { | ||
Self { | ||
resolver, | ||
kind, | ||
phantom: PhantomData, | ||
} | ||
} | ||
} | ||
|
||
pub struct M<TArg>(PhantomData<TArg>); | ||
impl<F, TLCtx, TResult, TArg> ResolverFunction<TLCtx> for HasResolver<F, TResult, M<TArg>> | ||
where | ||
F: Fn(TLCtx, TArg) -> TResult + Send + Sync + 'static, | ||
TArg: DeserializeOwned + Type + 'static, | ||
TLCtx: Send + Sync + 'static, | ||
TResult: 'static, | ||
{ | ||
// type Stream<'a> = Once<Ready<Result<Value, ExecError>>>; | ||
|
||
fn into_procedure_def( | ||
&self, | ||
key: Cow<'static, str>, | ||
ty_store: &mut TypeMap, | ||
) -> Result<ProcedureDef, TsExportError> { | ||
// ProcedureDef::from_tys::<TArg, TOk, TError>(key, ty_store) | ||
|
||
// TODO: Fix this | ||
ProcedureDef::from_tys::<TArg, (), ()>(key, ty_store) | ||
} | ||
|
||
fn exec(&self, ctx: TLCtx, input: Value, req: RequestContext) -> Value { | ||
// TODO: Error handling | ||
// serde_json::to_value((self.resolver)(ctx, serde_json::from_value(input).unwrap())) | ||
// .unwrap() | ||
todo!(); | ||
} | ||
pub struct M<TArg, TResultMarker>(PhantomData<(TArg, TResultMarker)>); | ||
impl<F, TLCtx, TErr, TArg, TResult, TResultMarker> Layer<TLCtx> | ||
for HasResolver<F, TErr, M<TArg, TResultMarker>> | ||
where | ||
F: Fn(TLCtx, TArg) -> TResult + Send + Sync + 'static, | ||
TArg: DeserializeOwned + Type + 'static, | ||
TLCtx: Send + Sync + 'static, | ||
TResult: IntoQueryMutationResponse<TResultMarker, TErr>, | ||
TResult::Ok: Serialize + Type + 'static, | ||
TErr: IntoResolverError + 'static, | ||
TResultMarker: 'static, | ||
{ | ||
// TODO: This is a placeholder | ||
type Stream<'a> = Once<Ready<Result<Value, ExecError>>>; | ||
|
||
fn into_procedure_def( | ||
&self, | ||
key: Cow<'static, str>, | ||
ty_store: &mut TypeMap, | ||
) -> Result<ProcedureDef, TsExportError> { | ||
ProcedureDef::from_tys::<TArg, TResult::Ok, TErr>(key, ty_store) | ||
} | ||
|
||
pub trait QueryMutationFn<TErr, M> {} | ||
|
||
impl<F, TResult, M, TMarker, TErr> QueryMutationFn<TErr, TMarker> for HasResolver<F, TResult, M> | ||
where | ||
TResult: IntoQueryMutationResponse<TMarker, TErr>, | ||
TResult::Ok: Serialize + Type + 'static, | ||
{ | ||
fn call( | ||
&self, | ||
ctx: TLCtx, | ||
input: Value, | ||
req: RequestContext, | ||
) -> Result<Self::Stream<'_>, ExecError> { | ||
// TODO: Error handling | ||
let y = (self.resolver)(ctx, serde_json::from_value(input).unwrap()); | ||
|
||
// TODO: Make this actually work | ||
Ok(Once::new(ready(Ok(Value::String("TODO".into()))))) | ||
} | ||
} | ||
|
||
pub(crate) use private::{HasResolver, QueryMutationFn, ResolverFunction}; |
Oops, something went wrong.