ondc-code-generator 0.8.9 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/alpha/table/page/index.html +11487 -0
- package/alpha/table/page/style.css +449 -0
- package/alpha/table/rag-table-docs/confirm.md +60 -0
- package/alpha/table/rag-table-docs/init.md +78 -0
- package/alpha/table/rag-table-docs/on_confirm.md +161 -0
- package/alpha/table/rag-table-docs/on_init.md +143 -0
- package/alpha/table/rag-table-docs/on_search.md +160 -0
- package/alpha/table/rag-table-docs/on_select.md +96 -0
- package/alpha/table/rag-table-docs/on_status.md +150 -0
- package/alpha/table/rag-table-docs/on_update.md +161 -0
- package/alpha/table/rag-table-docs/raw_table.json +11198 -0
- package/alpha/table/rag-table-docs/search.md +125 -0
- package/alpha/table/rag-table-docs/select.md +67 -0
- package/alpha/table/rag-table-docs/status.md +41 -0
- package/alpha/table/rag-table-docs/update.md +48 -0
- package/alpha/table/readme.md +1312 -0
- package/alpha/table/validPaths.json +34134 -0
- package/alpha/table.zip +0 -0
- package/dist/bin/cli.js +4 -0
- package/dist/generator/config-compiler.js +12 -0
- package/dist/generator/generators/documentation/md-generator.d.ts +11 -5
- package/dist/generator/generators/documentation/md-generator.js +22 -28
- package/dist/generator/generators/documentation/templates/index.mustache +162 -26
- package/dist/generator/generators/documentation/templates/style.css +387 -142
- package/dist/generator/generators/rag/rag-generator.d.ts +48 -0
- package/dist/generator/generators/rag/rag-generator.js +185 -0
- package/dist/generator/generators/rag/rag-table-generator.d.ts +55 -0
- package/dist/generator/generators/rag/rag-table-generator.js +263 -0
- package/dist/types/compiler-types.d.ts +3 -1
- package/dist/types/compiler-types.js +2 -0
- package/package.json +1 -1
- package/alpha/docs/page/index.html +0 -6137
- package/alpha/docs/page/style.css +0 -204
- package/alpha/docs/readme.md +0 -5939
- package/alpha/docs/validPaths.json +0 -14351
- package/alpha/page/index.html +0 -6137
- package/alpha/page/style.css +0 -204
- package/alpha/readme.md +0 -5939
- package/alpha/validationpkg/examples/search.json +0 -143
- package/alpha/validationpkg/examples_output/search/case-001/output.json +0 -12
- package/alpha/validationpkg/go.mod +0 -8
- package/alpha/validationpkg/go.sum +0 -4
- package/alpha/validationpkg/jsonvalidations/cancel.go +0 -1289
- package/alpha/validationpkg/jsonvalidations/confirm.go +0 -9121
- package/alpha/validationpkg/jsonvalidations/init.go +0 -4864
- package/alpha/validationpkg/jsonvalidations/issue.go +0 -4868
- package/alpha/validationpkg/jsonvalidations/on_cancel.go +0 -7111
- package/alpha/validationpkg/jsonvalidations/on_confirm.go +0 -8903
- package/alpha/validationpkg/jsonvalidations/on_init.go +0 -4445
- package/alpha/validationpkg/jsonvalidations/on_issue.go +0 -2828
- package/alpha/validationpkg/jsonvalidations/on_issue_status.go +0 -1938
- package/alpha/validationpkg/jsonvalidations/on_search.go +0 -3356
- package/alpha/validationpkg/jsonvalidations/on_status.go +0 -8129
- package/alpha/validationpkg/jsonvalidations/on_track.go +0 -1415
- package/alpha/validationpkg/jsonvalidations/on_update.go +0 -8700
- package/alpha/validationpkg/jsonvalidations/search.go +0 -3585
- package/alpha/validationpkg/jsonvalidations/status.go +0 -1073
- package/alpha/validationpkg/jsonvalidations/track.go +0 -1073
- package/alpha/validationpkg/jsonvalidations/update.go +0 -3012
- package/alpha/validationpkg/main-validator.go +0 -196
- package/alpha/validationpkg/main-validator_test.go +0 -165
- package/alpha/validationpkg/storageutils/api_save_utils.go +0 -83
- package/alpha/validationpkg/storageutils/cancel.go +0 -30
- package/alpha/validationpkg/storageutils/confirm.go +0 -30
- package/alpha/validationpkg/storageutils/index.go +0 -132
- package/alpha/validationpkg/storageutils/init.go +0 -30
- package/alpha/validationpkg/storageutils/issue.go +0 -30
- package/alpha/validationpkg/storageutils/on_cancel.go +0 -30
- package/alpha/validationpkg/storageutils/on_confirm.go +0 -30
- package/alpha/validationpkg/storageutils/on_init.go +0 -30
- package/alpha/validationpkg/storageutils/on_issue.go +0 -30
- package/alpha/validationpkg/storageutils/on_issue_status.go +0 -30
- package/alpha/validationpkg/storageutils/on_search.go +0 -30
- package/alpha/validationpkg/storageutils/on_status.go +0 -30
- package/alpha/validationpkg/storageutils/on_track.go +0 -30
- package/alpha/validationpkg/storageutils/on_update.go +0 -30
- package/alpha/validationpkg/storageutils/save_utils.go +0 -75
- package/alpha/validationpkg/storageutils/search.go +0 -30
- package/alpha/validationpkg/storageutils/status.go +0 -30
- package/alpha/validationpkg/storageutils/track.go +0 -30
- package/alpha/validationpkg/storageutils/update.go +0 -30
- package/alpha/validationpkg/validationutils/json_normalizer.go +0 -152
- package/alpha/validationpkg/validationutils/json_path_utils.go +0 -173
- package/alpha/validationpkg/validationutils/storage-interface.go +0 -107
- package/alpha/validationpkg/validationutils/test-config.go +0 -69
- package/alpha/validationpkg/validationutils/validation_utils.go +0 -429
|
@@ -1,429 +0,0 @@
|
|
|
1
|
-
// Code generated by github.com/ONDC-Official/automation-validation-compiler, DO NOT EDIT.
|
|
2
|
-
|
|
3
|
-
package validationutils
|
|
4
|
-
|
|
5
|
-
import (
|
|
6
|
-
"fmt"
|
|
7
|
-
"strconv"
|
|
8
|
-
"strings"
|
|
9
|
-
"sync"
|
|
10
|
-
"time"
|
|
11
|
-
|
|
12
|
-
"github.com/dlclark/regexp2"
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
// toStringSlice converts []interface{} to []string, returns false if any element is not a string
|
|
16
|
-
func toStringSlice(operand []interface{}) ([]string, bool) {
|
|
17
|
-
result := make([]string, len(operand))
|
|
18
|
-
for i, v := range operand {
|
|
19
|
-
str, ok := v.(string)
|
|
20
|
-
if !ok {
|
|
21
|
-
// Try to convert to string
|
|
22
|
-
if v == nil {
|
|
23
|
-
result[i] = "null"
|
|
24
|
-
} else {
|
|
25
|
-
result[i] = fmt.Sprintf("%v", v)
|
|
26
|
-
}
|
|
27
|
-
} else {
|
|
28
|
-
result[i] = str
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return result, true
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
func AreUnique(operand []interface{}) bool {
|
|
35
|
-
strs, ok := toStringSlice(operand)
|
|
36
|
-
if !ok {
|
|
37
|
-
return false
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
valuesSet := make(map[string]struct{})
|
|
41
|
-
for _, v := range strs {
|
|
42
|
-
valuesSet[v] = struct{}{}
|
|
43
|
-
}
|
|
44
|
-
return len(valuesSet) == len(strs)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
func ArePresent(operand []interface{}) bool {
|
|
48
|
-
strs, ok := toStringSlice(operand)
|
|
49
|
-
if !ok {
|
|
50
|
-
return false
|
|
51
|
-
}
|
|
52
|
-
return NoneIn(operand, []interface{}{"null", "undefined"}) && len(strs) > 0
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Lookup interface for abstraction
|
|
56
|
-
type lookup interface {
|
|
57
|
-
contains(string) bool
|
|
58
|
-
isEmpty() bool
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Map-based lookup (O(1))
|
|
62
|
-
type mapLookup struct {
|
|
63
|
-
items map[string]bool
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
func (m *mapLookup) contains(item string) bool {
|
|
67
|
-
return m.items[item]
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
func (m *mapLookup) isEmpty() bool {
|
|
71
|
-
return len(m.items) == 0
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Slice-based lookup (O(n))
|
|
75
|
-
type sliceLookup struct {
|
|
76
|
-
items []string
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
func (s *sliceLookup) contains(item string) bool {
|
|
80
|
-
for _, v := range s.items {
|
|
81
|
-
if v == item {
|
|
82
|
-
return true
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return false
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
func (s *sliceLookup) isEmpty() bool {
|
|
89
|
-
return len(s.items) == 0
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Smart lookup creation - auto-detects and optimizes
|
|
93
|
-
func createLookup(right []interface{}) (lookup, bool) {
|
|
94
|
-
// Case 1: Check if right contains a single map
|
|
95
|
-
if len(right) == 1 {
|
|
96
|
-
switch m := right[0].(type) {
|
|
97
|
-
case map[string]interface{}:
|
|
98
|
-
result := make(map[string]bool, len(m))
|
|
99
|
-
for k := range m {
|
|
100
|
-
result[k] = true
|
|
101
|
-
}
|
|
102
|
-
return &mapLookup{items: result}, true
|
|
103
|
-
case map[string]bool:
|
|
104
|
-
return &mapLookup{items: m}, true
|
|
105
|
-
case map[string]string:
|
|
106
|
-
result := make(map[string]bool, len(m))
|
|
107
|
-
for k := range m {
|
|
108
|
-
result[k] = true
|
|
109
|
-
}
|
|
110
|
-
return &mapLookup{items: result}, true
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Case 2: Convert slice to string slice
|
|
115
|
-
rightStrs, ok := toStringSlice(right)
|
|
116
|
-
if !ok {
|
|
117
|
-
return nil, false
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Optimization: Convert large slices to maps for better performance
|
|
121
|
-
const threshold = 10
|
|
122
|
-
if len(rightStrs) > threshold {
|
|
123
|
-
m := make(map[string]bool, len(rightStrs))
|
|
124
|
-
for _, v := range rightStrs {
|
|
125
|
-
m[v] = true
|
|
126
|
-
}
|
|
127
|
-
return &mapLookup{items: m}, true
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return &sliceLookup{items: rightStrs}, true
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Updated comparison functions
|
|
134
|
-
func AllIn(left []interface{}, right []interface{}) bool {
|
|
135
|
-
leftStrs, ok1 := toStringSlice(left)
|
|
136
|
-
if !ok1 {
|
|
137
|
-
return false
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
rightLookup, ok2 := createLookup(right)
|
|
141
|
-
if !ok2 {
|
|
142
|
-
return false
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if len(leftStrs) == 0 && !rightLookup.isEmpty() {
|
|
146
|
-
return false
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
for _, v := range leftStrs {
|
|
150
|
-
if !rightLookup.contains(v) {
|
|
151
|
-
return false
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return true
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
func AnyIn(left []interface{}, right []interface{}) bool {
|
|
158
|
-
leftStrs, ok1 := toStringSlice(left)
|
|
159
|
-
if !ok1 {
|
|
160
|
-
return false
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
rightLookup, ok2 := createLookup(right)
|
|
164
|
-
if !ok2 {
|
|
165
|
-
return false
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if len(leftStrs) == 0 && !rightLookup.isEmpty() {
|
|
169
|
-
return false
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
for _, v := range leftStrs {
|
|
173
|
-
if rightLookup.contains(v) {
|
|
174
|
-
return true
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return false
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
func NoneIn(left []interface{}, right []interface{}) bool {
|
|
181
|
-
leftStrs, ok1 := toStringSlice(left)
|
|
182
|
-
if !ok1 {
|
|
183
|
-
return false
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
rightLookup, ok2 := createLookup(right)
|
|
187
|
-
if !ok2 {
|
|
188
|
-
return false
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
for _, v := range leftStrs {
|
|
192
|
-
if rightLookup.contains(v) {
|
|
193
|
-
return false
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return true
|
|
197
|
-
}
|
|
198
|
-
func EqualTo(left []interface{}, right []interface{}) bool {
|
|
199
|
-
leftStrs, ok1 := toStringSlice(left)
|
|
200
|
-
rightStrs, ok2 := toStringSlice(right)
|
|
201
|
-
if !ok1 || !ok2 {
|
|
202
|
-
return false
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
if len(leftStrs) != len(rightStrs) {
|
|
206
|
-
return false
|
|
207
|
-
}
|
|
208
|
-
for i, v := range leftStrs {
|
|
209
|
-
if v != rightStrs[i] {
|
|
210
|
-
return false
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return true
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
func GreaterThan(left []interface{}, right []interface{}) bool {
|
|
217
|
-
leftStrs, ok1 := toStringSlice(left)
|
|
218
|
-
rightStrs, ok2 := toStringSlice(right)
|
|
219
|
-
if !ok1 || !ok2 {
|
|
220
|
-
return false
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
areAllISO := func(arr []string) bool {
|
|
224
|
-
for _, v := range arr {
|
|
225
|
-
if !isISO8601(v) {
|
|
226
|
-
return false
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return true
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
areAllNumbers := func(arr []string) bool {
|
|
233
|
-
for _, v := range arr {
|
|
234
|
-
if _, err := strconv.ParseFloat(v, 64); err != nil {
|
|
235
|
-
return false
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return true
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
if areAllISO(leftStrs) && areAllISO(rightStrs) {
|
|
242
|
-
leftDates := make([]int64, len(leftStrs))
|
|
243
|
-
for i, date := range leftStrs {
|
|
244
|
-
t, _ := time.Parse(time.RFC3339, date)
|
|
245
|
-
leftDates[i] = t.UnixMilli()
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
rightDates := make([]int64, len(rightStrs))
|
|
249
|
-
for i, date := range rightStrs {
|
|
250
|
-
t, _ := time.Parse(time.RFC3339, date)
|
|
251
|
-
rightDates[i] = t.UnixMilli()
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
for i, ld := range leftDates {
|
|
255
|
-
if i >= len(rightDates) || ld <= rightDates[i] {
|
|
256
|
-
if i < len(rightDates) {
|
|
257
|
-
return false
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
return true
|
|
262
|
-
} else if areAllNumbers(leftStrs) && areAllNumbers(rightStrs) {
|
|
263
|
-
leftNumbers := make([]float64, len(leftStrs))
|
|
264
|
-
for i, v := range leftStrs {
|
|
265
|
-
leftNumbers[i], _ = strconv.ParseFloat(v, 64)
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
rightNumbers := make([]float64, len(rightStrs))
|
|
269
|
-
for i, v := range rightStrs {
|
|
270
|
-
rightNumbers[i], _ = strconv.ParseFloat(v, 64)
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
for i, ln := range leftNumbers {
|
|
274
|
-
if i >= len(rightNumbers) || ln <= rightNumbers[i] {
|
|
275
|
-
if i < len(rightNumbers) {
|
|
276
|
-
return false
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
return true
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
return false
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
func LessThan(left []interface{}, right []interface{}) bool {
|
|
287
|
-
leftStrs, ok1 := toStringSlice(left)
|
|
288
|
-
rightStrs, ok2 := toStringSlice(right)
|
|
289
|
-
if !ok1 || !ok2 {
|
|
290
|
-
return false
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
areAllISO := func(arr []string) bool {
|
|
294
|
-
for _, v := range arr {
|
|
295
|
-
if !isISO8601(v) {
|
|
296
|
-
return false
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
return true
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
areAllNumbers := func(arr []string) bool {
|
|
303
|
-
for _, v := range arr {
|
|
304
|
-
if _, err := strconv.ParseFloat(v, 64); err != nil {
|
|
305
|
-
return false
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
return true
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
if areAllISO(leftStrs) && areAllISO(rightStrs) {
|
|
312
|
-
leftDates := make([]int64, len(leftStrs))
|
|
313
|
-
for i, date := range leftStrs {
|
|
314
|
-
t, _ := time.Parse(time.RFC3339, date)
|
|
315
|
-
leftDates[i] = t.UnixMilli()
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
rightDates := make([]int64, len(rightStrs))
|
|
319
|
-
for i, date := range rightStrs {
|
|
320
|
-
t, _ := time.Parse(time.RFC3339, date)
|
|
321
|
-
rightDates[i] = t.UnixMilli()
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
for i, ld := range leftDates {
|
|
325
|
-
if i >= len(rightDates) || ld >= rightDates[i] {
|
|
326
|
-
if i < len(rightDates) {
|
|
327
|
-
return false
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
return true
|
|
332
|
-
} else if areAllNumbers(leftStrs) && areAllNumbers(rightStrs) {
|
|
333
|
-
leftNumbers := make([]float64, len(leftStrs))
|
|
334
|
-
for i, v := range leftStrs {
|
|
335
|
-
leftNumbers[i], _ = strconv.ParseFloat(v, 64)
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
rightNumbers := make([]float64, len(rightStrs))
|
|
339
|
-
for i, v := range rightStrs {
|
|
340
|
-
rightNumbers[i], _ = strconv.ParseFloat(v, 64)
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
for i, ln := range leftNumbers {
|
|
344
|
-
if i >= len(rightNumbers) || ln >= rightNumbers[i] {
|
|
345
|
-
if i < len(rightNumbers) {
|
|
346
|
-
return false
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
return true
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
return false
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
var regexCache sync.Map // cache compiled regexes
|
|
357
|
-
|
|
358
|
-
func FollowRegex(left []interface{}, regexArray []interface{}) bool {
|
|
359
|
-
leftStrs, ok1 := toStringSlice(left)
|
|
360
|
-
regexStrs, ok2 := toStringSlice(regexArray)
|
|
361
|
-
if !ok1 || !ok2 {
|
|
362
|
-
return false
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
if len(leftStrs) == 0 && len(regexStrs) != 0 {
|
|
366
|
-
return false
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
for _, regexStr := range regexStrs {
|
|
370
|
-
var re *regexp2.Regexp
|
|
371
|
-
regexStr = sanitizeRegex(regexStr)
|
|
372
|
-
fmt.Printf("Using regex: %s\n", regexStr)
|
|
373
|
-
// Check cache first
|
|
374
|
-
if cached, ok := regexCache.Load(regexStr); ok {
|
|
375
|
-
re = cached.(*regexp2.Regexp)
|
|
376
|
-
} else {
|
|
377
|
-
compiled, err := regexp2.Compile(regexStr, 0)
|
|
378
|
-
if err != nil {
|
|
379
|
-
fmt.Printf("Invalid regex '%s': %v\n", regexStr, err)
|
|
380
|
-
return false
|
|
381
|
-
}
|
|
382
|
-
regexCache.Store(regexStr, compiled)
|
|
383
|
-
re = compiled
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
for _, v := range leftStrs {
|
|
387
|
-
match, err := re.MatchString(v)
|
|
388
|
-
if err != nil || !match {
|
|
389
|
-
return false
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
return true
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
// Only fixes escapes that are invalid in regexp2
|
|
398
|
-
func sanitizeRegex(regex string) string {
|
|
399
|
-
regex = strings.ReplaceAll(regex, `\_`, `_`) // escaped underscore → literal
|
|
400
|
-
regex = strings.ReplaceAll(regex, `\-`, `-`) // escaped hyphen → literal
|
|
401
|
-
return regex
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
func isISO8601(str string) bool {
|
|
405
|
-
iso8601Regex, err := regexp2.Compile(`^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$`, 0)
|
|
406
|
-
if err != nil {
|
|
407
|
-
return false
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
match, err := iso8601Regex.MatchString(str)
|
|
411
|
-
if err != nil || !match {
|
|
412
|
-
return false
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
_, err = time.Parse(time.RFC3339, str)
|
|
416
|
-
return err == nil
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
// StringSliceToInterface converts []string to []interface{}
|
|
420
|
-
func StringSliceToInterface(strs []string) []interface{} {
|
|
421
|
-
result := make([]interface{}, len(strs))
|
|
422
|
-
for i, v := range strs {
|
|
423
|
-
result[i] = v
|
|
424
|
-
}
|
|
425
|
-
return result
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
// UnusedFunction to avoid unused variable errors
|
|
429
|
-
func UnusedFunction(item interface{}) {}
|