/
helpers.go
110 lines (91 loc) · 2.56 KB
/
helpers.go
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
//
// Copyright 2023 The GUAC Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package backend
import (
"crypto/sha256"
"strings"
"entgo.io/ent/dialect/sql"
"github.com/google/uuid"
)
func IDEQ(id string) func(*sql.Selector) {
return sql.FieldEQ("id", id)
}
func NoOpSelector() func(*sql.Selector) {
return func(s *sql.Selector) {}
}
type Predicate interface {
~func(*sql.Selector)
}
func optionalPredicate[P Predicate, T any](value *T, fn func(s T) P) P {
if value == nil {
return NoOpSelector()
}
return fn(*value)
}
func ptrWithDefault[T any](value *T, defaultValue T) T {
if value == nil {
return defaultValue
}
return *value
}
func toPtrSlice[T any](slice []T) []*T {
ptrs := make([]*T, len(slice))
for i := range slice {
ptrs[i] = &slice[i]
}
return ptrs
}
// func fromPtrSlice[T any](slice []*T) []T {
// ptrs := make([]T, len(slice))
// for i := range slice {
// if slice[i] == nil {
// continue
// }
// ptrs[i] = *slice[i]
// }
// return ptrs
// }
func toLowerPtr(s *string) *string {
if s == nil {
return nil
}
lower := strings.ToLower(*s)
return &lower
}
func chunk[T any](collection []T, size int) [][]T {
if size <= 0 {
panic("Second parameter must be greater than 0")
}
chunksNum := len(collection) / size
if len(collection)%size != 0 {
chunksNum += 1
}
result := make([][]T, 0, chunksNum)
for i := 0; i < chunksNum; i++ {
last := (i + 1) * size
if last > len(collection) {
last = len(collection)
}
result = append(result, collection[i*size:last])
}
return result
}
// generateUUIDKey is used to generate the ID based on the sha256 hash of the content of the inputSpec that is passed in.
// For example, for artifact it would be
// artifactID := uuid.NewHash(sha256.New(), uuid.NameSpaceDNS, []byte(helpers.GetKey[*model.ArtifactInputSpec, string](artInput.ArtifactInput, helpers.ArtifactServerKey)), 5)
// where the data is generated by converting the artifactInputSpec into a canonicalized key
func generateUUIDKey(data []byte) uuid.UUID {
return uuid.NewHash(sha256.New(), uuid.NameSpaceDNS, data, 5)
}