use std::fmt::Debug;
pub use derived_cms_derive::Input;
use i18n_embed::fluent::FluentLanguageLoader;
use maud::Markup;
use crate::{context::ContextTrait, render::FormRenderContext};
pub trait Input<S: ContextTrait>: Debug {
fn render_input(
value: Option<&Self>,
name: &str,
title: &str,
required: bool,
ctx: &FormRenderContext<'_, S>,
i18n: &FluentLanguageLoader,
) -> Markup;
}
pub trait DynInput<S: ContextTrait>: Debug {
fn render_input(
&self,
name: &str,
title: &str,
required: bool,
ctx: &FormRenderContext<'_, S>,
i18n: &FluentLanguageLoader,
) -> Markup;
}
impl<T: Input<S>, S: ContextTrait> DynInput<S> for Option<&T> {
fn render_input(
&self,
name: &str,
title: &str,
required: bool,
ctx: &FormRenderContext<'_, S>,
i18n: &FluentLanguageLoader,
) -> Markup {
Input::render_input(self.as_deref(), name, title, required, ctx, i18n)
}
}
#[derive(Debug)]
pub struct InputInfo<'a, S: ContextTrait> {
pub name: &'a str,
pub title: &'a str,
pub help: Option<&'a str>,
pub value: Box<dyn DynInput<S> + 'a>,
}