use core::any::type_name;
use crate::{AnyView, Environment, View, layout::StretchAxis};
#[derive(Debug)]
pub struct Native<T: NativeView> {
native: T,
fallback: Option<AnyView>,
}
impl<T: NativeView> Native<T> {
pub const fn new(native: T) -> Self {
Self {
native,
fallback: None,
}
}
#[must_use]
pub fn with_fallback(mut self, fallback: impl View) -> Self {
self.fallback = Some(AnyView::new(fallback));
self
}
#[must_use]
pub fn into_inner(self) -> T {
self.native
}
#[must_use]
pub const fn as_inner(&self) -> &T {
&self.native
}
pub const fn as_inner_mut(&mut self) -> &mut T {
&mut self.native
}
}
impl<T: 'static + NativeView> View for Native<T> {
fn body(self, _env: &Environment) -> impl View {
self.fallback
.unwrap_or_else(|| panic!("Native view ({})", type_name::<T>()))
}
fn stretch_axis(&self) -> StretchAxis {
NativeView::stretch_axis(&self.native)
}
}
pub trait NativeView {
fn stretch_axis(&self) -> StretchAxis {
StretchAxis::None
}
}