aboutsummaryrefslogtreecommitdiff
path: root/info
diff options
context:
space:
mode:
authorStefan Majewsky <majewsky@gmx.net>2026-04-10 20:13:15 +0200
committerStefan Majewsky <majewsky@gmx.net>2026-04-10 20:13:15 +0200
commit293e2a52e0b45065db12ff27f89f1adebe4bf4d2 (patch)
tree2e7efecdf5ee359df9c6b09ece3443ea33432462 /info
parente0fb5aa0acc1983648ab1480f22114aead234eeb (diff)
downloadgo-oblast-293e2a52e0b45065db12ff27f89f1adebe4bf4d2.tar.gz
reorganize code
Diffstat (limited to 'info')
-rw-r--r--info/info.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/info/info.go b/info/info.go
new file mode 100644
index 0000000..7ca35ba
--- /dev/null
+++ b/info/info.go
@@ -0,0 +1,55 @@
+// SPDX-FileCopyrightText: 2026 Stefan Majewsky <majewsky@gmx.net>
+// SPDX-License-Identifier: Apache-2.0
+
+// Package info contains marker types that can be placed in user-defined struct types.
+// Doing so enables certain operations within Oblast that rely on the metadata attached to these markers.
+package info // import "go.xyrillian.de/oblast/info"
+
+// seal is a private type that appears in interface definitions below,
+// to ensure that only types from this package can implement these interfaces.
+type seal struct{}
+
+// TableNameIs is a zero-sized marker for struct types that correspond to tables.
+// Put this as an embedded field on your struct type and put the table name in the field's `db` tag.
+//
+// // For example, this struct type...
+// type LogEntry struct {
+// info.TableNameIs `db:"log_entries"`
+// info.PrimaryKeyIs `db:"id"`
+// ID int64 `db:"id,auto"`
+// CreatedAt time.Time `db:"created_at"`
+// Message string `db:"message"`
+// }
+// // ...corresponds to this table schema (shown here in PostgreSQL syntax):
+// CREATE TABLE log_entries (
+// id BIGSERIAL NOT NULL PRIMARY KEY,
+// created_at TIMESTAMPTZ NOT NULL,
+// message TEXT NOT NULL
+// );
+//
+// This marker is required for all operations that use autogenerated SQL statements.
+type TableNameIs struct{}
+
+// hasTableMarker implements the IsTable interface.
+func (TableNameIs) hasTableMarker(seal) {}
+
+// IsTable is implemented by all types that have an embedded field of type [TableNameIs].
+type IsTable interface {
+ hasTableMarker(seal)
+}
+
+// PrimaryKeyIs is a zero-sized marker for struct types that correspond to tables with a primary key.
+// Put this as an embedded field on your struct type and list the columns of the primary key in the field's `db` tag,
+// as shown on the example for type [TableNameIs].
+//
+// This marker is required for all UPDATE and DELETE operations that use autogenerated SQL statements.
+type PrimaryKeyIs struct{}
+
+// hasPrimaryKeyMarker implements the IsTableWithPrimaryKey interface.
+func (PrimaryKeyIs) hasPrimaryKeyMarker(seal) {} //nolint:unused // TODO
+
+// IsTableWithPrimaryKey is implemented by all types that have embedded fields of type [TableNameIs] and [PrimaryKeyIs].
+type IsTableWithPrimaryKey interface {
+ hasTableMarker(seal)
+ hasPrimaryKeyMarker(seal)
+}