Skip to main content

EmbeddedForm

Derive Macro EmbeddedForm 

Source
#[derive(EmbeddedForm)]
{
    // Attributes available to this derive:
    #[form]
}
Expand description

Derives EmbeddedForm for an embedded struct or enum.

Builds the schema node and converts the value through that node’s keys.

#[derive(Debug, Clone, toasty::Embed, tablo_core::EmbeddedForm)]
pub enum Publication {
    #[column(variant = 1)]
    Scheduled {
        #[shared(timestamp)]
        #[form(label = "Publication timestamp")]
        scheduled_at: String,
        scheduled_for: String,
    },
    #[column(variant = 2)]
    Published {
        #[shared(timestamp)]
        published_at: String,
        canonical_url: String,
    },
}

// form declaration — no field bindings written by hand
Section::new("Publication").schema(Publication::form(Post::fields().publication()));

§How a field is classified

A field marked #[form(embed)] is another embedded value, delegated to its own EmbeddedForm. Every other field is a scalar: one column, read and written through FormScalar (String, a TypedValue type, or an Option of one). A scalar of another type fails to compile at the field, naming the trait. An empty scalar is its declared #[form(blank = ..)], else its FormScalar::blank(); with neither, the parse refuses its key.

§Which variant an enum reads

A named discriminant always wins, and an undeclared one is refused; otherwise the first variant, in declaration order, with a payload of its own submitted — a #[shared(..)] column belongs to several variants and never selects one; otherwise the first variant.

§Per-field attributes

  • #[form(embed)] — a nested EmbeddedForm value.
  • #[form(label = "Canonical URL")] — the control’s label (default: the field name, humanized).
  • #[form(multiline = 3)] — a <textarea> of 3 rows.
  • #[form(blank = ..)] — what an empty submission reads as, overriding the leaf type’s own answer.

Anything else in #[form(..)] is a compile error, as are label, multiline, and blank on an embedded value. Derives EmbeddedForm for an embedded struct or enum.

Builds the schema node and converts the value through that node’s keys.

#[derive(Debug, Clone, toasty::Embed, tablo_core::EmbeddedForm)]
pub enum Publication {
    #[column(variant = 1)]
    Scheduled {
        #[shared(timestamp)]
        #[form(label = "Publication timestamp")]
        scheduled_at: String,
        scheduled_for: String,
    },
    #[column(variant = 2)]
    Published {
        #[shared(timestamp)]
        published_at: String,
        canonical_url: String,
    },
}

// form declaration — no field bindings written by hand
Section::new("Publication").schema(Publication::form(Post::fields().publication()));

§How a field is classified

A field marked #[form(embed)] is another embedded value, delegated to its own EmbeddedForm. Every other field is a scalar: one column, read and written through FormScalar (String, a TypedValue type, or an Option of one). A scalar of another type fails to compile at the field, naming the trait. An empty scalar is its declared #[form(blank = ..)], else its FormScalar::blank(); with neither, the parse refuses its key.

§Which variant an enum reads

A named discriminant always wins, and an undeclared one is refused; otherwise the first variant, in declaration order, with a payload of its own submitted — a #[shared(..)] column belongs to several variants and never selects one; otherwise the first variant.

§Per-field attributes

  • #[form(embed)] — a nested EmbeddedForm value.
  • #[form(label = "Canonical URL")] — the control’s label (default: the field name, humanized).
  • #[form(multiline = 3)] — a <textarea> of 3 rows.
  • #[form(blank = ..)] — what an empty submission reads as, overriding the leaf type’s own answer.

Anything else in #[form(..)] is a compile error, as are label, multiline, and blank on an embedded value.