use std::cell::{Cell, RefCell};
use std::str::FromStr;
use crate::ergonomics::Ref;
use crate::signal::Signal;
pub trait VModel {
fn vmodel_set(&self, payload: &str);
}
impl<T: FromStr + Default> VModel for Cell<T> {
fn vmodel_set(&self, payload: &str) {
self.set(payload.parse().unwrap_or_default());
}
}
impl VModel for RefCell<String> {
fn vmodel_set(&self, payload: &str) {
self.replace(payload.to_string());
}
}
impl<T: FromStr + Default + Clone> VModel for Signal<T> {
fn vmodel_set(&self, payload: &str) {
self.set(payload.parse().unwrap_or_default());
}
}
impl<T: FromStr + Default + Clone + 'static> VModel for Ref<T> {
fn vmodel_set(&self, payload: &str) {
self.set(payload.parse().unwrap_or_default());
}
}
pub fn apply_str(target: &impl VModel, payload: &str) {
target.vmodel_set(payload);
}