leptos-struct-table 0.18.0

Generate a complete batteries included leptos data table component from a struct definition.
Documentation
macro_rules! renderer_fn {
    (
        $name:ident<$($ty:ident),*>($($arg_name:ident: $arg_ty:ty),*)
        where $($clause:tt)*
    ) => {
        #[derive(Clone)]
        pub struct $name<$($ty),*> (
            Arc<dyn Fn($($arg_ty),*) -> AnyView + Sync + Send + 'static>,
        )
        where $($clause)*;

        impl<F, Ret, $($ty),*> From<F> for $name<$($ty),*>
        where
            F: Fn($($arg_ty),*) -> Ret + Sync + Send + 'static,
            Ret: IntoView + 'static,
            $($clause)*
        {
            fn from(f: F) -> Self {
                Self(Arc::new(move |$($arg_name),*| {
                    f($($arg_name),*).into_any()
                }))
            }
        }

        impl<$($ty),*> $name <$($ty),*>
        where $($clause)*
        {
            pub fn run(&self, $($arg_name: $arg_ty),*) -> AnyView {
                (self.0)($($arg_name),*)
            }
        }
    };

    (
        $name:ident<$($ty:ident),*>($($arg_name:ident: $arg_ty:ty),*)
        default $default:ident
        where $($clause:tt)*
    ) => {
        renderer_fn!(
            $name<$($ty),*>($($arg_name: $arg_ty),*)
            where $($clause)*
        );

        impl<$($ty),*> Default for $name<$($ty),*>
        where $($clause)*
        {
            fn default() -> Self {
                Self(Arc::new(move |$($arg_name),*| {
                    $default($($arg_name),*).into_any()
                }))
            }
        }
    };

    (
        $name:ident<$($ty:ident),*>($($arg_name:ident: $arg_ty:ty),*)
        default $default:ident
    ) => {
        renderer_fn!(
            $name<$($ty),*>($($arg_name: $arg_ty),*)
            default $default
            where
        );
    };

    (
        $name:ident($($arg_name:ident: $arg_ty:ty),*)
        default $default:ident
    ) => {
        renderer_fn!(
            $name<>($($arg_name: $arg_ty),*)
            default $default
        );
    };

    (
        $name:ident<$($ty:ident),*>($($arg_name:ident: $arg_ty:ty),*)
    ) => {
        renderer_fn!(
            $name<$($ty),*>($($arg_name: $arg_ty),*)
            where
        );
    };

    (
        $name:ident($($arg_name:ident: $arg_ty:ty),*)
    ) => {
        renderer_fn!(
            $name<>($($arg_name: $arg_ty),*)
            where
        );
    };
}

pub(crate) use renderer_fn;