sark-gen 0.29.1

Sark proc-macro generators
Documentation
use crate::{macros::tokens::local, runtime::paths::Paths};

pub(in crate::app::serve) struct Path(proc_macro2::TokenStream);

impl Path {
    pub(in crate::app::serve) fn new(paths: &Paths, leaves: usize, slot: usize) -> Self {
        use quote::quote;
        let ns_fiber = &paths.fiber;

        let path = match leaves {
            0 | 1 => quote!(#ns_fiber::dope_fiber::task::storage::fixed::tree::Here),
            leaves => {
                let split = leaves / 2;
                if slot < split {
                    let path = Self::new(paths, split, slot);
                    quote!(#ns_fiber::dope_fiber::task::storage::fixed::tree::Left<#path>)
                } else {
                    let path = Self::new(paths, leaves - split, slot - split);
                    quote!(#ns_fiber::dope_fiber::task::storage::fixed::tree::Right<#path>)
                }
            }
        };
        Self(path)
    }

    pub(in crate::app::serve) fn route(
        &self,
        generics: &crate::types::Generics,
    ) -> proc_macro2::TokenStream {
        let f_tasks = local("tasks");
        use quote::quote;

        let path = self;
        let this = generics.local("this");
        quote! { #this.#f_tasks.as_mut().scope().into_route::<#path>() }
    }
}

impl quote::ToTokens for Path {
    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
        self.0.to_tokens(tokens);
    }
}