use freya_core::prelude::{
Component,
IntoElement,
provide_context,
try_consume_context,
use_hook,
};
use crate::prelude::Routable;
pub(crate) struct ChildRouteMapping<R> {
format_route_as_root_route: fn(R) -> String,
parse_route_from_root_route: fn(&str) -> Option<R>,
}
impl<R: Routable> ChildRouteMapping<R> {
pub(crate) fn format_route_as_root_route(&self, route: R) -> String {
(self.format_route_as_root_route)(route)
}
pub(crate) fn parse_route_from_root_route(&self, route: &str) -> Option<R> {
(self.parse_route_from_root_route)(route)
}
}
pub(crate) fn consume_child_route_mapping<R: Routable>() -> Option<ChildRouteMapping<R>> {
try_consume_context()
}
impl<R> Clone for ChildRouteMapping<R> {
fn clone(&self) -> Self {
Self {
format_route_as_root_route: self.format_route_as_root_route,
parse_route_from_root_route: self.parse_route_from_root_route,
}
}
}
pub struct ChildRouter<R: Routable> {
route: R,
parse_route_from_root_route: fn(&str) -> Option<R>,
format_route_as_root_route: fn(R) -> String,
}
impl<R: Routable> PartialEq for ChildRouter<R> {
fn eq(&self, _: &Self) -> bool {
false
}
}
impl<R: Routable> Component for ChildRouter<R> {
fn render(&self) -> impl IntoElement {
use_hook(|| {
provide_context(ChildRouteMapping {
format_route_as_root_route: self.format_route_as_root_route,
parse_route_from_root_route: self.parse_route_from_root_route,
})
});
self.route.render(0)
}
}