wip: directionalize!

can't fit all into 1 trait because of directionality
of trait implementation rules and constraints :(
This commit is contained in:
🪞👃🪞 2025-05-20 18:48:55 +03:00
parent f797a7143d
commit 7c1cddc759
10 changed files with 221 additions and 222 deletions

View file

@ -1,63 +1,54 @@
use crate::*;
#[cfg(feature = "dsl")]
#[macro_export] macro_rules! try_delegate {
($s:ident, $dsl:expr, $T:ty) => {
let value: Option<$T> = Dsl::take_from($s, $dsl)?;
if let Some(value) = value {
return Ok(Some(value.boxed()))
}
}
}
//#[cfg(feature = "dsl")]
//#[macro_export] macro_rules! try_delegate {
//($s:ident, $dsl:expr, $T:ty) => {
//let value: Option<$T> = Dsl::take_from($s, $dsl)?;
//if let Some(value) = value {
//return Ok(Some(value.boxed()))
//}
//}
//}
// Provides components to the view.
#[cfg(feature = "dsl")]
pub trait ViewContext<'state, E: Output + 'state>: Send + Sync where
bool: Dsl<Self>,
usize: Dsl<Self>,
E::Unit: Dsl<Self>,
{
fn get_content_or_fail <'source: 'state> (&'state self, iter: &mut TokenIter<'source>)
-> Usually<RenderBox<'state, E>>
{
let base = iter.clone();
if let Some(content) = self.get_content(iter)? {
Ok(content)
} else {
Err(format!("not found: {iter:?}").into())
}
}
fn get_content <'source: 'state> (&'state self, iter: &mut TokenIter<'source>)
-> Perhaps<RenderBox<'state, E>>
{
match iter.peek() {
Some(Token { value: Value::Sym(_), .. }) =>
self.get_content_sym(iter),
Some(Token { value: Value::Exp(_, _), .. }) =>
self.get_content_exp(iter),
None => Ok(None),
_ => panic!("only :symbols and (expressions) accepted here")
}
}
fn get_content_sym <'source: 'state> (&'state self, iter: &mut TokenIter<'source>)
-> Perhaps<RenderBox<'state, E>>;
fn get_content_exp <'source: 'state> (&'state self, iter: &mut TokenIter<'source>)
-> Perhaps<RenderBox<'state, E>>
{
try_delegate!(self, iter, When::<RenderBox<'state, E>>);
try_delegate!(self, iter, Either::<RenderBox<'state, E>, RenderBox<'state, E>>);
try_delegate!(self, iter, Align::<RenderBox<'state, E>>);
try_delegate!(self, iter, Bsp::<RenderBox<'state, E>, RenderBox<'state, E>>);
try_delegate!(self, iter, Fill::<RenderBox<'state, E>>);
try_delegate!(self, iter, Fixed::<_, RenderBox<'state, E>>);
try_delegate!(self, iter, Min::<_, RenderBox<'state, E>>);
try_delegate!(self, iter, Max::<_, RenderBox<'state, E>>);
try_delegate!(self, iter, Shrink::<_, RenderBox<'state, E>>);
try_delegate!(self, iter, Expand::<_, RenderBox<'state, E>>);
try_delegate!(self, iter, Push::<_, RenderBox<'state, E>>);
try_delegate!(self, iter, Pull::<_, RenderBox<'state, E>>);
try_delegate!(self, iter, Margin::<_, RenderBox<'state, E>>);
try_delegate!(self, iter, Padding::<_, RenderBox<'state, E>>);
Ok(None)
}
}
//// Provides components to the view.
//#[cfg(feature = "dsl")]
//pub trait ViewContext<'state, E: Output + 'state>:
//FromDsl<bool> + FromDsl<usize> + FromDsl<E::Unit> + Send + Sync
//{
//fn get_content_sym <'source: 'state> (&'state self, iter: &mut TokenIter<'source>)
//-> Perhaps<RenderBox<'state, E>>;
//fn get_content_exp <'source: 'state> (&'state self, iter: &mut TokenIter<'source>)
//-> Perhaps<RenderBox<'state, E>>
//{
//try_delegate!(self, iter, When::<RenderBox<'state, E>>);
//try_delegate!(self, iter, Either::<RenderBox<'state, E>, RenderBox<'state, E>>);
//try_delegate!(self, iter, Align::<RenderBox<'state, E>>);
//try_delegate!(self, iter, Bsp::<RenderBox<'state, E>, RenderBox<'state, E>>);
//try_delegate!(self, iter, Fill::<RenderBox<'state, E>>);
//try_delegate!(self, iter, Fixed::<_, RenderBox<'state, E>>);
//try_delegate!(self, iter, Min::<_, RenderBox<'state, E>>);
//try_delegate!(self, iter, Max::<_, RenderBox<'state, E>>);
//try_delegate!(self, iter, Shrink::<_, RenderBox<'state, E>>);
//try_delegate!(self, iter, Expand::<_, RenderBox<'state, E>>);
//try_delegate!(self, iter, Push::<_, RenderBox<'state, E>>);
//try_delegate!(self, iter, Pull::<_, RenderBox<'state, E>>);
//try_delegate!(self, iter, Margin::<_, RenderBox<'state, E>>);
//try_delegate!(self, iter, Padding::<_, RenderBox<'state, E>>);
//Ok(None)
//}
//}
//#[cfg(feature = "dsl")]
//impl<'context, O: Output + 'context, T: ViewContext<'context, O>> FromDsl<T> for RenderBox<'context, O> {
//fn take_from <'state, 'source: 'state> (state: &'state T, token: &mut TokenIter<'source>)
//-> Perhaps<RenderBox<'context, O>>
//{
//Ok(if let Some(content) = state.get_content_sym(token)? {
//Some(content)
//} else if let Some(content) = state.get_content_exp(token)? {
//Some(content)
//} else {
//None
//})
//}
//}