diff --git a/cover.html b/cover.html
new file mode 100644
index 0000000..158d2dc
--- /dev/null
+++ b/cover.html
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+ not tracked
+
+ no coverage
+ low coverage
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ high coverage
+
+
+
+
+
+
package metadata
+
+import (
+ "reflect"
+)
+
+type Metadata struct {
+ ID string `json:"id"`
+ ETag string `json:"etag"`
+ Generation int64 `json:"generation"`
+}
+
+func HasMetadata(obj any) bool {
+ return getMetadataField(obj).IsValid()
+}
+
+func GetMetadata(obj any) *Metadata {
+ return getMetadataField(obj).Addr().Interface().(*Metadata)
+}
+
+func ClearMetadata(obj any) {
+ SetMetadata(obj, &Metadata{})
+}
+
+func SetMetadata(obj any, md *Metadata) {
+ getMetadataField(obj).Set(reflect.ValueOf(*md))
+}
+
+func getMetadataField(obj any) reflect.Value {
+ v := reflect.ValueOf(obj)
+
+ return reflect.Indirect(v).FieldByName("Metadata")
+}
+
+
+
+
+
+
diff --git a/cover.out b/cover.out
new file mode 100644
index 0000000..9d90fb9
--- /dev/null
+++ b/cover.out
@@ -0,0 +1,6 @@
+mode: atomic
+github.com/gopatchy/metadata/metadata.go:13.32,15.2 1 0
+github.com/gopatchy/metadata/metadata.go:17.37,19.2 1 1
+github.com/gopatchy/metadata/metadata.go:21.29,23.2 1 1
+github.com/gopatchy/metadata/metadata.go:25.41,27.2 1 1
+github.com/gopatchy/metadata/metadata.go:29.46,33.2 2 2