// use std::{any::Any, pin::Pin, process::Output, sync::Arc}; // use futures_util::{future::LocalBoxFuture, Future, FutureExt}; // use giterated_models::{ // error::{ExtractorError, OperationError, RepositoryError}, // object::GiteratedObject, // operation::GiteratedOperation, // repository::{Repository, RepositoryBranch, RepositoryBranchesRequest}, // settings::SetSetting, // user::{DisplayName, User}, // value::{GetValue, GiteratedObjectValue}, // }; // use giterated_stack::{ // AuthorizedUser, FromOperationState, GiteratedStack, MissingValue, StackOperationState, // }; // use crate::CacheSubstack; // async fn value_update( // object: AnyObject<'_>, // value: AnyValue<'_>, // cache: CacheSubstack, // stack: Arc, // ) -> Result<(), anyhow::Error> { // todo!() // } // pub struct AnyObject<'o>(&'o (dyn Any + Send + Sync)); // pub struct AnyValue<'v>(&'v (dyn Any + Send + Sync)); // #[async_trait::async_trait(?Send)] // pub trait GiteratedHandler // { // async fn handle( // &self, // parameters: RequiredParameters, // additional_parameters: AdditionalParameters, // state: Arc, // operation_state: &OperationState, // ) -> Output; // } // #[async_trait::async_trait(?Send)] // impl GiteratedHandler<(R1,), (), S, O, Output> for F // where // F: FnMut(R1, S, &O) -> Fut, // Fut: Future, // S: 'static, // R1: 'static, // { // async fn handle( // &self, // parameters: (R1,), // additional_parameters: (), // state: Arc, // operation_state: &O, // ) -> Output { // todo!() // } // } // #[async_trait::async_trait(?Send)] // impl GiteratedHandler<(R1,), (A1,), S, O, Output> for F // where // F: FnMut(R1, S, &O, A1) -> Fut, // Fut: Future, // S: 'static, // R1: 'static, // A1: 'static + HandlerResolvable<(R1,), O, A1>, // { // async fn handle( // &self, // parameters: (R1,), // additional_parameters: (A1,), // state: Arc, // operation_state: &O, // ) -> Output { // todo!() // } // } // #[async_trait::async_trait(?Send)] // impl GiteratedHandler<(R1,), (A1, A2), S, O, Output> for F // where // F: FnMut(R1, S, &O, A1, A2) -> Fut, // Fut: Future, // S: 'static, // R1: 'static, // A1: 'static + HandlerResolvable<(R1,), O, A1>, // A2: 'static + HandlerResolvable<(R1,), O, A2>, // { // async fn handle( // &self, // parameters: (R1,), // additional_parameters: (A1, A2), // state: Arc, // operation_state: &O, // ) -> Output { // todo!() // } // } // #[async_trait::async_trait(?Send)] // impl GiteratedHandler<(R1,), (A1, A2, A3), S, O, Output> for F // where // F: FnMut(R1, S, &O, A1, A2, A3) -> Fut, // Fut: Future, // S: 'static, // R1: 'static, // A1: 'static + HandlerResolvable<(R1,), O, A1>, // A2: 'static + HandlerResolvable<(R1,), O, A2>, // A3: 'static + HandlerResolvable<(R1,), O, A3>, // { // async fn handle( // &self, // parameters: (R1,), // additional_parameters: (A1, A2, A3), // state: Arc, // operation_state: &O, // ) -> Output { // todo!() // } // } // #[async_trait::async_trait(?Send)] // impl GiteratedHandler<(R1, R2), (), S, O, Output> for F // where // F: FnMut(R1, R2, S, &O) -> Fut, // Fut: Future, // S: 'static, // R1: 'static, // R2: 'static, // { // async fn handle( // &self, // parameters: (R1, R2), // additional_parameters: (), // state: Arc, // operation_state: &O, // ) -> Output { // todo!() // } // } // #[async_trait::async_trait(?Send)] // impl GiteratedHandler<(R1, R2), (A1,), S, O, Output> for F // where // F: FnMut(R1, R2, S, &O, A1) -> Fut, // Fut: Future, // S: 'static, // R1: 'static, // R2: 'static, // A1: 'static + HandlerResolvable<(R1, R2), O, A1>, // { // async fn handle( // &self, // parameters: (R1, R2), // additional_parameters: (A1,), // state: Arc, // operation_state: &O, // ) -> Output { // todo!() // } // } // #[async_trait::async_trait(?Send)] // impl GiteratedHandler<(R1, R2), (A1, A2), S, O, Output> for F // where // F: FnMut(R1, R2, S, &O, A1, A2) -> Fut, // Fut: Future, // S: 'static, // R1: 'static, // R2: 'static, // A1: 'static + HandlerResolvable<(R1, R2), O, A1>, // A2: 'static + HandlerResolvable<(R1, R2), O, A2>, // { // async fn handle( // &self, // parameters: (R1, R2), // additional_parameters: (A1, A2), // state: Arc, // operation_state: &O, // ) -> Output { // todo!() // } // } // #[async_trait::async_trait(?Send)] // impl // GiteratedHandler<(R1, R2), (A1, A2, A3), S, O, Output> for F // where // F: FnMut(R1, R2, S, &O, A1, A2, A3) -> Fut, // Fut: Future, // S: 'static, // R1: 'static, // R2: 'static, // A1: 'static + HandlerResolvable<(R1, R2), O, A1>, // A2: 'static + HandlerResolvable<(R1, R2), O, A2>, // A3: 'static + HandlerResolvable<(R1, R2), O, A3>, // { // async fn handle( // &self, // parameters: (R1, R2), // additional_parameters: (A1, A2, A3), // state: Arc, // operation_state: &O, // ) -> Output { // todo!() // } // } // #[async_trait::async_trait(?Send)] // impl GiteratedHandler<(R1, R2, R3), (), S, O, Output> for F // where // F: FnMut(R1, R2, R3, S, &O) -> Fut, // Fut: Future, // S: 'static, // R1: 'static, // R2: 'static, // R3: 'static, // { // async fn handle( // &self, // parameters: (R1, R2, R3), // additional_parameters: (), // state: Arc, // operation_state: &O, // ) -> Output { // todo!() // } // } // fn test_fn(handler: F) // where // F: GiteratedHandler<(O, V), A, S, StackOperationState, Result<(), anyhow::Error>>, // O: GiteratedObject, // V: GiteratedObjectValue, // { // } // fn other_fn() { // let a = String::from("a"); // let test = move |object: User, // value: GetValue, // state: (), // operation_state: &StackOperationState, // authorized_user: AuthorizedUser| { async move { () } }; // let wrapper = HandlerWrapper::<(User, GetValue), _>::new((), test); // } // pub struct HandlerWrapper { // func: Box LocalBoxFuture<'static, O>>, // state: Arc, // } // impl HandlerWrapper { // pub fn new(state: S, handler: F) -> Self // where // F: GiteratedHandler, // S: Send + Sync + 'static, // A: HandlerResolvableGroup

, // { // let state = Arc::new(state); // let func = |required: P, operation_state: StackOperationState| { // // async move { handler.handle(required, (), state, &operation_state) }.boxed_local() // todo!() // }; // Self { // func: Box::new(func), // state, // } // } // } // #[async_trait::async_trait(?Send)] // pub trait HandlerResolvable { // async fn from_handler_state( // required_parameters: &RequiredParameters, // operation_state: &OperationState, // ) -> Output; // } // #[async_trait::async_trait(?Send)] // impl HandlerResolvable<(User, GetValue), StackOperationState, Self> for Arc { // async fn from_handler_state( // required_parameters: &(User, GetValue), // operation_state: &StackOperationState, // ) -> Self { // todo!() // } // } // // #[async_trait::async_trait(?Send)] // // impl HandlerResolvable<(O, D), StackOperationState, T> for T // // where // // O: GiteratedObject, // // D: GiteratedOperation, // // T: FromOperationState, // // { // // async fn from_handler_state( // // required_parameters: &(O, D), // // operation_state: &StackOperationState, // // ) -> T { // // todo!() // // } // // } // #[async_trait::async_trait(?Send)] // pub trait HandlerResolvableGroup { // async fn group_from_handler_state( // required_parameters: &RequiredParameters, // operation_state: &StackOperationState, // ) -> Self; // } // #[async_trait::async_trait(?Send)] // impl HandlerResolvableGroup for (A1,) // where // A1: HandlerResolvable, // { // async fn group_from_handler_state( // required_parameters: &RequiredParameters, // operation_state: &StackOperationState, // ) -> (A1,) { // (A1::from_handler_state(required_parameters, operation_state).await,) // } // } // #[async_trait::async_trait(?Send)] // impl HandlerResolvableGroup for (A1, A2) // where // A1: HandlerResolvable, // A2: HandlerResolvable, // { // async fn group_from_handler_state( // required_parameters: &RequiredParameters, // operation_state: &StackOperationState, // ) -> (A1, A2) { // ( // A1::from_handler_state(required_parameters, operation_state).await, // A2::from_handler_state(required_parameters, operation_state).await, // ) // } // }