Socket
Socket
Sign inDemoInstall

git.sr.ht/~jackmordaunt/gio-planet/form

Package Overview
Dependencies
2
Alerts
File Explorer

Install Socket

Detect and block malicious and high-risk dependencies

Install

    git.sr.ht/~jackmordaunt/gio-planet/form

Package form implements primitives that reduce form boilerplate by allowing the caller to specify their fields exactly once. All values are processed via a chain of transformations that map text into a structured value, and visa versa. Each transformation is encapsulated in a `form.Value` implementation, for instance a `value.Int` will transform text into a Go integer and signal any errors that occur during that transformation. Forms are initialized once with all the fields via a call to `form.Load`. Each field binds an input to a value. By contention, value objects depend on pointer variables, this means you can simply point into a predefined "model" struct. Once the form is submitted, the model will contain the validated values ready to use. However this is only a convention, a value object can arbitrarily handle it's internal state. The following is an example of one way to use the form:


Version published

Readme

Source

form

Go Reference

Primitives for specifying forms.

The fundamental idea explored here is in separating form concerns. The three core abstractions are the Form, the Value and the Input. Value and Input combine together into a Field.

  • Input abstracts the interactible graphical widget that accepts input.
  • Value abstracts the transformation of text to structured data.
  • Field maps an Input to a Value.
  • Form provides a consistent api for handling a group of fields, namely batch and realtime validation.

Status

This repo is experimental, and does not have a stable interface.

Ideally form initialization would be fully declarative, where the zero value is directly usable. However it's not clear how to achieve such an api.

Some potential avenues to explore:

  • code generation: take a struct definition and generate the form code.
  • reflection: introspect a struct definition and generate form.Fields on the fly.

Use

Since the api is experimental, there is no "idiomatic usage".

Fundamentally, a form binds inputs to values and there are numerous ways to compose it.

This is an example of one way to use the package: one-time initialization that you can call in an update function once per frame.

type Person struct {
    Age    int
    Name   string
    Salary float64
}

type PersonForm struct {
    form.Form
    // Model contains the structured data.
    Model Person
    // Inputs contains the input state.
    Inputs struct {
        Age    component.TextField
        Name   component.TextField
        Salary component.TextField
    }
    init sync.Once
}

func (pf *PersonForm) Update() {
    pf.init.Do(func() {
        pf.Form.Load([]form.Field{
            {
                Value: value.Int{Value: &pf.Model.Age, Default: 18},
                Input: &pf.Inputs.Age,
            },
            {
                Value: value.Required{value.Text{Value: &pf.Model.Name, Default: ""}},
                Input: &pf.Inputs.Name,
            },
            {
                Value: value.Float{Value: &pf.Model.Salary, Default: 0},
                Input: &pf.Inputs.Salary,
            },
        })
    })
}

FAQs

Last updated on 30 Jun 2021

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc