/templ-component-opts

Generate code for templ component option structs.

Primary LanguageGoMIT LicenseMIT

Templ Component Opts

This project is designed to help generate code to simplify passing options to a templ component.

Rather than creating templ components that take multiple parameters, they can instead take a single parameters that includes the various bits of context that are important for the component.

For example:

// example/view/index.templ
package view

import (
    "time"

    "github.com/codekoala/templ-component-opts/example/view/component/book"
)

templ Index() {
    <html>
        <body>
            @book.Book(book.With(
                book.Title("1984"),
                book.Author("George Orwell"),
                book.Published(MustParse("June 8, 1949")),
            ))

            @book.Book(book.With(
                book.Display(false),
                book.Title("Dune"),
                book.Author("Frank Herbert"),
                book.Published(MustParse("August 1, 1965")),
            ))
        </body>
    </html>
}

// MustParse parses a date or panics.
func MustParse(value string) time.Time {
    val, err := time.Parse("January 2, 2006", value)
    if  err != nil {
        panic(err)
    }
    return val
}

Installation

You can install templ-component-opts using the go install command:

$ go install github.com/codekoala/templ-component-opts@latest

This will download and install the executable in your $GOPATH/bin directory.

Usage

To use templ-component-opts, simply create a struct with the various options that you may want to pass to a templ component and include the //templ:component-opts directive:

// example/view/component/book/book.go
package book

import "time"

// Opts defines options for the Book templ component.
//
//templ:component-opts
type Opts struct {
	Title     string
	Author    string
	Published time.Time
	Display   bool `default:"true"`
}

As illustrated by teh Display field, default values can be specified using the default tag.

Run the templ-component-opts tool pointing to the project directory:

$ templ-component-opts .

This will produce a new file with the suffix _tcogen.go:

// example/view/component/book/book_tcogen.go
// Code generated by templ-component-opts; DO NOT EDIT.
// This file contains functions and methods for use with Opts in templ components.
package book

import (
	"strconv"
	"time"
)

type Opt func(*Opts)

func DefaultOpts() *Opts {
	out := &Opts{Display: true}
	return out
}
func With(opts ...Opt) *Opts {
	out := DefaultOpts()
	out.With(opts...)
	return out
}
func (o *Opts) With(opts ...Opt) *Opts {
	for _, opt := range opts {
		opt(o)
	}
	return o
}

func Title(in string) Opt {
	return func(opts *Opts) {
		opts.Title = in
	}
}

func Author(in string) Opt {
	return func(opts *Opts) {
		opts.Author = in
	}
}

func Published(in time.Time) Opt {
	return func(opts *Opts) {
		opts.Published = in
	}
}

func Display(in bool) Opt {
	return func(opts *Opts) {
		opts.Display = in
	}
}

func (o *Opts) DisplayStr() string {
	return strconv.FormatBool(o.Display)
}

In the interest of keeping things as simple as possible, package level functions are created to populate fields in the annotated struct. For some data types, such as int64, float64, and bool, additional methods are generated on the struct to return a stringified version of the field.

go generate

Add a single //go:generate templ-component-opts . in your project, and go generate should automatically produce the _tcogen.go files for any struct with the //templ:component-opts directive.

License

This project is licensed under the MIT License. See the LICENSE file for details.