File: annotation.go

package info (click to toggle)
golang-entgo-ent 0.11.3-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 21,976 kB
  • sloc: javascript: 641; makefile: 8; sql: 2
file content (81 lines) | stat: -rw-r--r-- 1,958 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Copyright 2019-present Facebook Inc. All rights reserved.
// This source code is licensed under the Apache 2.0 license found
// in the LICENSE file in the root directory of this source tree.

package field

import "entgo.io/ent/schema"

// Annotation is a builtin schema annotation for
// configuring the schema fields in codegen.
type Annotation struct {
	// The StructTag option allows overriding the struct-tag
	// of the fields in the generated entity. For example:
	//
	//	field.Annotation{
	//		StructTag: map[string]string{
	//			"id": `json:"id,omitempty" yaml:"-"`,
	//		},
	//	}
	//
	StructTag map[string]string

	// ID defines a multi-field schema identifier. Note,
	// the annotation is valid only for edge schemas.
	//
	//	func (TweetLike) Annotations() []schema.Annotation {
	//		return []schema.Annotation{
	//			field.ID("user_id", "tweet_id"),
	//		}
	//	}
	//
	ID []string
}

// ID defines a multi-field schema identifier. Note, the
// annotation is valid only for edge schemas.
//
//	func (TweetLike) Annotations() []schema.Annotation {
//		return []schema.Annotation{
//			field.ID("user_id", "tweet_id"),
//		}
//	}
//
func ID(first, second string, fields ...string) *Annotation {
	return &Annotation{ID: append([]string{first, second}, fields...)}
}

// Name describes the annotation name.
func (Annotation) Name() string {
	return "Fields"
}

// Merge implements the schema.Merger interface.
func (a Annotation) Merge(other schema.Annotation) schema.Annotation {
	var ant Annotation
	switch other := other.(type) {
	case Annotation:
		ant = other
	case *Annotation:
		if other != nil {
			ant = *other
		}
	default:
		return a
	}
	if a.StructTag == nil && len(ant.StructTag) > 0 {
		a.StructTag = make(map[string]string, len(ant.StructTag))
	}
	for k, v := range ant.StructTag {
		a.StructTag[k] = v
	}
	if len(ant.ID) > 0 {
		a.ID = ant.ID
	}
	return a
}

var _ interface {
	schema.Annotation
	schema.Merger
} = (*Annotation)(nil)