templ-component-opts

command module
v0.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 26, 2023 License: MIT Imports: 9 Imported by: 0

README

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.

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
view/component/book
Code generated by templ-component-opts; DO NOT EDIT.
Code generated by templ-component-opts; DO NOT EDIT.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL