forked from algebraic-brain/algorithmia-go
-
Notifications
You must be signed in to change notification settings - Fork 2
/
acl.go
101 lines (80 loc) · 1.96 KB
/
acl.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
package algorithmia
import (
"errors"
"fmt"
)
type aclInner struct {
pseudonym string
aclString string
}
func (a *aclInner) String() string {
return fmt.Sprintf("AclType(pseudonym=%q,acl_string=%q)", a.pseudonym, a.aclString)
}
var aclTable = []*aclInner{
&aclInner{"public", "user://*"},
&aclInner{"my_algos", "algo://.my/*"},
&aclInner{"private", ""},
}
type AclType int
func (t AclType) Pseudonym() string {
return aclTable[t].pseudonym
}
func (t AclType) AclString() string {
return aclTable[t].aclString
}
func (t AclType) String() string {
return aclTable[t].String()
}
const (
AclTypePublic AclType = iota
AclTypeMyAlgos
AclTypePrivate
AclTypeDefault = AclTypeMyAlgos
)
var aclMap = map[string]AclType{
AclTypePublic.AclString(): AclTypePublic,
AclTypeMyAlgos.AclString(): AclTypeMyAlgos,
AclTypePrivate.AclString(): AclTypePrivate,
}
func aclTypeFromResponse(aclList []string) (AclType, error) {
if aclList == nil || len(aclList) == 0 {
return AclTypePrivate, nil
}
if t, ok := aclMap[aclList[0]]; ok {
return t, nil
}
return AclType(-1), errors.New(fmt.Sprint("Invalid acl string ", aclList[0]))
}
type Acl struct {
readAcl AclType
}
func (a *Acl) ReadAcl() AclType {
return a.readAcl
}
func (a *Acl) apiParam() *aclResponse {
s := a.readAcl.AclString()
if s == "" {
return &aclResponse{Read: []string{}}
}
return &aclResponse{Read: []string{s}}
}
type aclResponse struct {
Read []string `json:"read" mapstructure:"read"`
}
func (a *aclResponse) String() string {
return fmt.Sprintf("AclResponse(read=%v)", a.Read)
}
var NoAclProvided = errors.New("Response does not contain read ACL")
func aclFromResponse(resp *aclResponse) (*Acl, error) {
if resp.Read != nil {
t, err := aclTypeFromResponse(resp.Read)
if err != nil {
return nil, err
}
return &Acl{readAcl: t}, nil
}
return nil, NoAclProvided
}
var ReadAclPublic = &Acl{AclTypePublic}
var ReadAclPrivate = &Acl{AclTypePrivate}
var ReadAclMyAlgos = &Acl{AclTypeMyAlgos}