sark-gen 0.26.2

Sark proc-macro generators
Documentation
use crate::{
    app::serve::{self, handle},
    runtime::paths::Paths,
};

pub(in crate::app::serve::handle) fn fiber(
    paths: &Paths,
    context: &handle::Context<'_, '_, '_>,
    task: serve::Task<'_, '_>,
    runtime: &proc_macro2::TokenStream,
    state: proc_macro2::TokenStream,
    timer: proc_macro2::TokenStream,
    make: proc_macro2::TokenStream,
) -> proc_macro2::TokenStream {
    let generics = &context.plan.spec.state_generics;
    let identity = &context.exec.identity;
    let variant = task.variant();
    let route = task.route();
    let [n_admit, n_close] = generics.locals(["__admission", "__close"]);
    let [n_used, n_input] = generics.locals(["__consumed", "__input"]);
    let [n_resp, n_run] = generics.locals(["__response", "__runtime"]);
    let [n_source, n_task] = generics.locals(["__source", "__task"]);
    let [n_tasks] = generics.locals(["__tasks"]);
    let ns_core = &paths.core;
    let ns_fiber = &paths.fiber;
    let ns_h1 = &paths.h1;
    use quote::quote;

    let stored = if task.is_stream() {
        task.make(paths, &n_task)
    } else {
        quote!(#ns_fiber::dope_fiber::task::storage::fixed::staged::Task::new(#n_task))
    };
    quote! {{
        let #n_source = #n_tasks.as_mut();
        move || {
            #ns_fiber::dope_fiber::task::storage::fixed::direct::Source::admit(#n_source).map(
                |#n_admit| {
                    move |
                        #n_input: #ns_core::manifold::task::request::Input<'d, #route>,
                        #n_used,
                        #n_close,
                        #n_resp: #ns_h1::wire::response::Context,
                        #n_run: &mut #runtime,
                    | {
                        let #n_task = (#make)((#n_input, #state, #timer));
                        let #n_task = #ns_fiber::dope_fiber::task::storage::fixed::direct::Insert::insert(
                            #n_admit,
                            #stored,
                        );
                        #n_run.insert(
                            #ns_h1::server::task::runtime::Running::fiber(
                                #identity::#variant(#n_task),
                                #n_resp,
                            ),
                        );
                        #ns_h1::session::Outcome::Park {
                            consumed: #n_used,
                            close: #n_close,
                        }
                    }
                },
            )
        }
    }}
}

pub(in crate::app::serve::handle) fn stream(
    paths: &Paths,
    generics: &crate::types::Generics,
    identity: &syn::Ident,
    runtime: &proc_macro2::TokenStream,
    variant: &syn::Ident,
) -> proc_macro2::TokenStream {
    let [n_admit, n_resp] = generics.locals(["__admission", "__response"]);
    let [n_run, n_source] = generics.locals(["__runtime", "__source"]);
    let [n_stream, n_task] = generics.locals(["__stream", "__task"]);
    let [n_tasks] = generics.locals(["__tasks"]);
    let ns_fiber = &paths.fiber;
    let ns_h1 = &paths.h1;
    use quote::quote;

    quote! {{
        let #n_source = #n_tasks.as_mut();
        move || {
            #ns_fiber::dope_fiber::task::storage::fixed::direct::Source::admit(#n_source).map(
                |#n_admit| {
                    move |
                        #n_stream,
                        #n_run: &mut #runtime,
                        #n_resp: #ns_h1::wire::response::Context,
                    | {
                        let #n_task = #ns_fiber::dope_fiber::task::storage::fixed::direct::Insert::insert(
                            #n_admit,
                            #n_stream,
                        );
                        #n_run.insert(
                            #ns_h1::server::task::runtime::Running::stream(
                                #identity::#variant(#n_task),
                                #n_resp,
                            ),
                        );
                    }
                },
            )
        }
    }}
}