package pnyx type PermissionLevel int const ( PERMISSION_FALLTHROUGH PermissionLevel = iota PERMISSION_ALLOW PERMISSION_DENY PERMISSION_ALLOW_ALL PERMISSION_DENY_ALL ) type Role string type Action string type Permissions map[Action]Permission type Permission struct { Level PermissionLevel Next Permissions } func(permissions Permissions) Allowed(action []Action, def bool) bool { if len(action) == 0 { return def } else if permissions == nil { return def } perm, exists := permissions[action[0]] if exists == false { return def } else if len(action) == 1 { return perm.Level == PERMISSION_ALLOW || perm.Level == PERMISSION_ALLOW_ALL } else { switch perm.Level { case PERMISSION_ALLOW_ALL: return perm.Next.Allowed(action[1:], true) case PERMISSION_DENY_ALL: return perm.Next.Allowed(action[1:], false) default: return perm.Next.Allowed(action[1:], def) } } } func(permissions Permissions) Copy() Permissions { if permissions == nil { return nil } new_permissions := Permissions{} for action, permission := range(permissions) { new_permissions[action] = Permission{ Level: permission.Level, Next: permission.Next.Copy(), } } return new_permissions }