use crate::*;
impl From<Vec<VirtualNode>> for VirtualNode {
fn from(nodes: Vec<VirtualNode>) -> Self {
if nodes.is_empty() {
VirtualNode::Empty
} else {
VirtualNode::Fragment(nodes)
}
}
}
impl From<Option<VirtualNode>> for VirtualNode {
fn from(node: Option<VirtualNode>) -> Self {
match node {
Some(node) => node,
None => VirtualNode::Empty,
}
}
}
impl From<Option<Vec<VirtualNode>>> for VirtualNode {
fn from(nodes: Option<Vec<VirtualNode>>) -> Self {
match nodes {
Some(nodes) => nodes.into(),
None => VirtualNode::Empty,
}
}
}
impl<F> From<F> for VirtualNode
where
F: FnMut(&mut HookContext) -> VirtualNode + 'static,
{
fn from(render_fn: F) -> Self {
VirtualNode::create_dynamic(render_fn)
}
}
impl From<String> for VirtualNode {
fn from(text: String) -> Self {
VirtualNode::Text(TextNode::new(text, None))
}
}
impl From<&str> for VirtualNode {
fn from(text: &str) -> Self {
VirtualNode::Text(TextNode::new(text.to_string(), None))
}
}
impl From<i32> for VirtualNode {
fn from(value: i32) -> Self {
VirtualNode::Text(TextNode::new(value.to_string(), None))
}
}
impl From<usize> for VirtualNode {
fn from(value: usize) -> Self {
VirtualNode::Text(TextNode::new(value.to_string(), None))
}
}
impl From<bool> for VirtualNode {
fn from(value: bool) -> Self {
VirtualNode::Text(TextNode::new(value.to_string(), None))
}
}
impl<T> From<Signal<T>> for VirtualNode
where
T: Clone + PartialEq + Display + 'static,
{
fn from(signal: Signal<T>) -> Self {
signal.as_reactive_text()
}
}
impl<T> AsReactiveText for Signal<T>
where
T: Clone + PartialEq + Display + 'static,
{
fn as_reactive_text(&self) -> VirtualNode {
let source: Signal<T> = *self;
let string_signal: Signal<String> = Signal::create(source.get().to_string());
let string_signal_clone: Signal<String> = string_signal;
source.subscribe(move || {
string_signal_clone.set(source.get().to_string());
});
VirtualNode::Text(TextNode::new(string_signal.get(), Some(string_signal)))
}
}
impl<T> EventAdapter<T> {
pub(crate) fn into_inner(self) -> T {
self.inner
}
}
impl<F> EventAdapter<F>
where
F: FnMut(Event) + 'static,
{
pub fn into_attribute(self, event_name: &'static str) -> AttributeValue {
AttributeValue::Event(NativeEventHandler::create(event_name, self.into_inner()))
}
}
impl<F> From<EventNamedAdapter<F>> for AttributeValue
where
F: FnMut(Event) + 'static,
{
fn from(adapter: EventNamedAdapter<F>) -> Self {
AttributeValue::Event(NativeEventHandler::create(
adapter.get_event_name(),
adapter.inner,
))
}
}
impl From<EventNamedAdapter<NativeEventHandler>> for AttributeValue {
fn from(mut adapter: EventNamedAdapter<NativeEventHandler>) -> Self {
let event_name: &'static str = adapter.get_event_name();
adapter.get_mut_inner().set_event_name(event_name);
AttributeValue::Event(adapter.inner)
}
}
impl From<EventNamedAdapter<Option<Rc<dyn Fn(Event)>>>> for AttributeValue {
fn from(adapter: EventNamedAdapter<Option<Rc<dyn Fn(Event)>>>) -> Self {
let event_name: &'static str = adapter.get_event_name();
match adapter.inner {
Some(callback) => AttributeValue::Event(NativeEventHandler::create(
event_name,
move |event: Event| {
callback(event);
},
)),
None => AttributeValue::Text(String::new()),
}
}
}
impl EventAdapter<NativeEventHandler> {
pub fn into_attribute(self, event_name: &'static str) -> AttributeValue {
let mut handler: NativeEventHandler = self.into_inner();
handler.set_event_name(event_name);
AttributeValue::Event(handler)
}
}
impl EventAdapter<Option<NativeEventHandler>> {
pub fn into_attribute(self, event_name: &'static str) -> AttributeValue {
match self.into_inner() {
Some(handler) => EventNamedAdapter::new(handler, event_name).into(),
None => AttributeValue::Text(String::new()),
}
}
}
impl EventAdapter<Option<Rc<dyn Fn(Event)>>> {
pub fn into_attribute(self, event_name: &'static str) -> AttributeValue {
match self.into_inner() {
Some(callback) => AttributeValue::Event(NativeEventHandler::create(
event_name,
move |event: Event| {
callback(event);
},
)),
None => AttributeValue::Text(String::new()),
}
}
}
impl<T> AttrValueAdapter<T> {
pub(crate) fn into_inner(self) -> T {
self.inner
}
}
impl<F> AttrValueAdapter<F>
where
F: FnMut(Event) + 'static,
{
pub fn into_callback(self) -> AttributeValue {
self.into_inner().into()
}
pub fn into_callback_named(self, name: &'static str) -> AttributeValue {
AttributeValue::Event(NativeEventHandler::create(name, self.into_inner()))
}
}
impl<F> From<CallbackNamedAdapter<F>> for AttributeValue
where
F: FnMut(Event) + 'static,
{
fn from(adapter: CallbackNamedAdapter<F>) -> Self {
AttributeValue::Event(NativeEventHandler::create(
adapter.get_name(),
adapter.inner,
))
}
}
impl AttrValueAdapter<NativeEventHandler> {
pub fn into_callback_named(self, name: &'static str) -> AttributeValue {
let mut handler: NativeEventHandler = self.into_inner();
handler.set_event_name(name);
AttributeValue::Event(handler)
}
}
impl AttrValueAdapter<Option<NativeEventHandler>> {
pub fn into_callback(self) -> AttributeValue {
match self.into_inner() {
Some(handler) => AttrValueAdapter::new(handler).into(),
None => AttributeValue::Text(String::new()),
}
}
pub fn into_callback_named(self, name: &'static str) -> AttributeValue {
match self.into_inner() {
Some(handler) => AttrValueAdapter::new(handler).into_callback_named(name),
None => AttributeValue::Text(String::new()),
}
}
}
impl<T> From<AttrValueAdapter<T>> for AttributeValue
where
T: Into<AttributeValue>,
{
fn from(adapter: AttrValueAdapter<T>) -> Self {
adapter.into_inner().into()
}
}