formidable 0.1.0

Easily derive forms from structs for Leptos.
Documentation
use std::fmt::Debug;

use leptos::prelude::*;

use derive_more::{Deref, Display, Into};
use thiserror::Error;

use crate::{components::Checkbox, FieldError, Form, FormError, Name};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Display, Into, Deref)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Accept(bool);

#[derive(Debug, Clone, Copy, Error, PartialEq, Eq, Hash)]
pub enum AcceptError {
    #[error("This is required")]
    NotAccepted,
}

impl TryFrom<bool> for Accept {
    type Error = AcceptError;

    fn try_from(value: bool) -> Result<Self, Self::Error> {
        if value {
            Ok(Accept(true))
        } else {
            Err(AcceptError::NotAccepted)
        }
    }
}

impl Form for Accept {
    fn view(
        field: crate::FieldConfiguration,
        name: Name,
        value: Option<Self>,
        callback: Option<Callback<Result<Self, FormError>>>,
    ) -> impl IntoView {
        view! {
            <Checkbox<Accept>
                label=field.label.expect("No label provided")
                description=field.description
                name=name
                value=value
                callback={callback.map(|callback| Callback::new(move |v: Result<Self, FieldError>| {
                    callback.run(v.map_err(FormError::from));
                }))}
            />
        }
    }
}