forked from fauna/faunadb-go
/
expr.go
92 lines (72 loc) · 2.37 KB
/
expr.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
package faunadb
import "encoding/json"
/*
Expr is the base type for FaunaDB query language expressions.
Expressions are created by using the query language functions in query.go. Query functions are designed to compose with each other, as well as with
custom data structures. For example:
type User struct {
Name string
}
_, _ := client.Query(
Create(
Collection("users"),
Obj{"data": User{"John"}},
),
)
*/
type Expr interface {
expr() // Make sure only internal structures can be marked as valid expressions
}
type unescapedObj map[string]Expr
type unescapedArr []Expr
type invalidExpr struct{ err error }
func (obj unescapedObj) expr() {}
func (arr unescapedArr) expr() {}
func (inv invalidExpr) expr() {}
func (inv invalidExpr) MarshalJSON() ([]byte, error) {
return nil, inv.err
}
// Obj is a expression shortcut to represent any valid JSON object
type Obj map[string]interface{}
// Arr is a expression shortcut to represent any valid JSON array
type Arr []interface{}
func (obj Obj) expr() {}
func (arr Arr) expr() {}
// MarshalJSON implements json.Marshaler for Obj expression
func (obj Obj) MarshalJSON() ([]byte, error) { return json.Marshal(wrap(obj)) }
// MarshalJSON implements json.Marshaler for Arr expression
func (arr Arr) MarshalJSON() ([]byte, error) { return json.Marshal(wrap(arr)) }
// OptionalParameter describes optional parameters for query language functions
type OptionalParameter func(unescapedObj)
func applyOptionals(options []OptionalParameter, fn unescapedObj) Expr {
for _, option := range options {
option(fn)
}
return fn
}
func fn1(k1 string, v1 interface{}, options ...OptionalParameter) Expr {
return applyOptionals(options, unescapedObj{
k1: wrap(v1),
})
}
func fn2(k1 string, v1 interface{}, k2 string, v2 interface{}, options ...OptionalParameter) Expr {
return applyOptionals(options, unescapedObj{
k1: wrap(v1),
k2: wrap(v2),
})
}
func fn3(k1 string, v1 interface{}, k2 string, v2 interface{}, k3 string, v3 interface{}, options ...OptionalParameter) Expr {
return applyOptionals(options, unescapedObj{
k1: wrap(v1),
k2: wrap(v2),
k3: wrap(v3),
})
}
func fn4(k1 string, v1 interface{}, k2 string, v2 interface{}, k3 string, v3 interface{}, k4 string, v4 interface{}, options ...OptionalParameter) Expr {
return applyOptionals(options, unescapedObj{
k1: wrap(v1),
k2: wrap(v2),
k3: wrap(v3),
k4: wrap(v4),
})
}