https://github.com/nhas/tetcd
A typesafe harness for etcd
https://github.com/nhas/tetcd
etcd typesafety wag
Last synced: about 1 month ago
JSON representation
A typesafe harness for etcd
- Host: GitHub
- URL: https://github.com/nhas/tetcd
- Owner: NHAS
- Created: 2026-04-14T08:02:13.000Z (about 2 months ago)
- Default Branch: main
- Last Pushed: 2026-04-21T15:01:50.000Z (about 1 month ago)
- Last Synced: 2026-04-21T16:42:06.958Z (about 1 month ago)
- Topics: etcd, typesafety, wag
- Language: Go
- Homepage:
- Size: 82 KB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Typesafe Etcd
This project combines code-generation and generics to hopefully provide a fairly usable typesafe harness for the KV store etcd.
It generates both the path to your values, based on the struct you pass it when generating, and determines the types.
## Example
For example, you have your configuration/database layout.
```go
package config
type ServerConfig struct {
Host string
Port int
}
type TLSConfig struct {
CertFile string
KeyFile string
}
type Config struct {
Server ServerConfig
TLS TLSConfig
Name string
Labels map[string]string
Tags []string `tetcd:"compress"`
// should be skipped
ignored string
SkippedField string `tetcd:"-"`
}
```
Then in another file in your project:
```go
//go:generate go run github.com/NHAS/tetcd/cmd/tetcd-gen -type=github.com/NHAS/tetcd/cmd/test/config.Config -out=config_etcd.go
```
```go
// Code generated by https://github.com/NHAS/tetcd, DO NOT EDIT.
package main
import (
codecs "github.com/NHAS/tetcd/codecs"
paths "github.com/NHAS/tetcd/paths"
)
type autoTypeConfigServer struct{}
// Host() KV should contain type string
func (autoTypeConfigServer) Host() paths.Path[string] {
return paths.NewPath("wagtest/Config/Server/Host", codecs.NewJsonCodec[string]())
}
// Port() KV should contain type int
func (autoTypeConfigServer) Port() paths.Path[int] {
return paths.NewPath("wagtest/Config/Server/Port", codecs.NewJsonCodec[int]())
}
type autoTypeConfigTLS struct{}
// CertFile() KV should contain type string
func (autoTypeConfigTLS) CertFile() paths.Path[string] {
return paths.NewPath("wagtest/Config/TLS/CertFile", codecs.NewJsonCodec[string]())
}
// KeyFile() KV should contain type string
func (autoTypeConfigTLS) KeyFile() paths.Path[string] {
return paths.NewPath("wagtest/Config/TLS/KeyFile", codecs.NewJsonCodec[string]())
}
type autoTypeConfig struct {
Server autoTypeConfigServer
TLS autoTypeConfigTLS
}
// Labels() is a map path with prefix wagtest/Config/Labels, value type string
func (autoTypeConfig) Labels() paths.MapPath[string] {
return paths.NewMapPath("wagtest/Config/Labels", codecs.NewJsonCodec[string]())
}
// Name() KV should contain type string
func (autoTypeConfig) Name() paths.Path[string] {
return paths.NewPath("wagtest/Config/Name", codecs.NewJsonCodec[string]())
}
// Tags() KV should contain type []string
func (autoTypeConfig) Tags() paths.Path[[]string] {
return paths.NewPath("wagtest/Config/Tags", codecs.NewJsonCodec[[]string]())
}
var Config = autoTypeConfig{}
```
Then you can use it like this:
```go
func UpdateLabels(labelName, contents string) error {
return Config.Labels().Key(labelName).Put(context.Background(), etcdclient, contents)
}
```
## Configuration
### `generate`
| Flag | Default | Description |
|---|---|---|
| `-prefix` | `""` | The global etcd key prefix |
| `-type` | `""` | Fully qualified type to analyse, e.g. `github.com/some/pkg.Config` (required) |
| `-pkg` | `$GOPACKAGE` | Output package name |
| `-out` | `_gen.go` | Output file path |
### Struct tags
The generator supports two tag options:
`tetcd:"compress"`: Store value of slices/maps as value on a key rather than as keys under a prefix
`tetcd:"-"`: Ignore this struct field
## Used
https://github.com/NHAS/wag