+89
@@ -0,0 +1,89 @@
|
||||
// Copyright 2018-2023 CERN
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
// In applying this license, CERN does not waive the privileges and immunities
|
||||
// granted to it by virtue of its status as an Intergovernmental Organization
|
||||
// or submit itself to any jurisdiction.
|
||||
|
||||
package cfg
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"reflect"
|
||||
|
||||
"github.com/go-playground/locales/en"
|
||||
ut "github.com/go-playground/universal-translator"
|
||||
"github.com/go-playground/validator/v10"
|
||||
en_translations "github.com/go-playground/validator/v10/translations/en"
|
||||
"github.com/mitchellh/mapstructure"
|
||||
)
|
||||
|
||||
// Setter is the interface a configuration struct may implement
|
||||
// to set the default options.
|
||||
type Setter interface {
|
||||
// ApplyDefaults applies the default options.
|
||||
ApplyDefaults()
|
||||
}
|
||||
|
||||
var validate = validator.New()
|
||||
var english = en.New()
|
||||
var uni = ut.New(english, english)
|
||||
var trans, _ = uni.GetTranslator("en")
|
||||
var _ = en_translations.RegisterDefaultTranslations(validate, trans)
|
||||
|
||||
func init() {
|
||||
validate.RegisterTagNameFunc(func(field reflect.StructField) string {
|
||||
if k := field.Tag.Get("mapstructure"); k != "" {
|
||||
return k
|
||||
}
|
||||
// if not specified, fall back to field name
|
||||
return field.Name
|
||||
})
|
||||
}
|
||||
|
||||
// Decode decodes the given raw input interface to the target pointer c.
|
||||
// It applies the default configuration if the target struct
|
||||
// implements the Setter interface.
|
||||
// It also perform a validation to all the fields of the configuration.
|
||||
func Decode(input map[string]any, c any) error {
|
||||
config := &mapstructure.DecoderConfig{
|
||||
Metadata: nil,
|
||||
Result: c,
|
||||
}
|
||||
|
||||
decoder, err := mapstructure.NewDecoder(config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := decoder.Decode(input); err != nil {
|
||||
return err
|
||||
}
|
||||
if s, ok := c.(Setter); ok {
|
||||
s.ApplyDefaults()
|
||||
}
|
||||
|
||||
return translateError(validate.Struct(c), trans)
|
||||
}
|
||||
|
||||
func translateError(err error, trans ut.Translator) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
errs := err.(validator.ValidationErrors)
|
||||
translated := make([]error, 0, len(errs))
|
||||
for _, err := range errs {
|
||||
translated = append(translated, errors.New(err.Translate(trans)))
|
||||
}
|
||||
return errors.Join(translated...)
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
// Copyright 2018-2023 CERN
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
// In applying this license, CERN does not waive the privileges and immunities
|
||||
// granted to it by virtue of its status as an Intergovernmental Organization
|
||||
// or submit itself to any jurisdiction.
|
||||
|
||||
package list
|
||||
|
||||
// Map returns a list constructed by appling a function f
|
||||
// to all items in the list l.
|
||||
func Map[T, V any](l []T, f func(T) V) []V {
|
||||
m := make([]V, 0, len(l))
|
||||
for _, e := range l {
|
||||
m = append(m, f(e))
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
// Remove removes the element in position i from the list.
|
||||
// It does not preserve the order of the original slice.
|
||||
func Remove[T any](l []T, i int) []T {
|
||||
l[i] = l[len(l)-1]
|
||||
return l[:len(l)-1]
|
||||
}
|
||||
|
||||
// TakeFirst returns the first elemen, if any, that satisfies
|
||||
// the predicate p.
|
||||
func TakeFirst[T any](l []T, p func(T) bool) (T, bool) {
|
||||
for _, e := range l {
|
||||
if p(e) {
|
||||
return e, true
|
||||
}
|
||||
}
|
||||
var z T
|
||||
return z, false
|
||||
}
|
||||
|
||||
// ToMap returns a map from l where the keys are obtainined applying
|
||||
// the func k to the elements of l.
|
||||
func ToMap[K comparable, T any](l []T, k func(T) K) map[K]T {
|
||||
m := make(map[K]T, len(l))
|
||||
for _, e := range l {
|
||||
m[k(e)] = e
|
||||
}
|
||||
return m
|
||||
}
|
||||
+17
@@ -34,6 +34,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
appprovider "github.com/cs3org/go-cs3apis/cs3/app/provider/v1beta1"
|
||||
gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1"
|
||||
grouppb "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1"
|
||||
userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
|
||||
@@ -382,6 +383,22 @@ func GetViewMode(viewMode string) gateway.OpenInAppRequest_ViewMode {
|
||||
}
|
||||
}
|
||||
|
||||
// GetAppViewMode converts a human-readable string to an appprovider view mode for opening a resource in an app.
|
||||
func GetAppViewMode(viewMode string) appprovider.ViewMode {
|
||||
switch viewMode {
|
||||
case "view":
|
||||
return appprovider.ViewMode_VIEW_MODE_VIEW_ONLY
|
||||
case "read":
|
||||
return appprovider.ViewMode_VIEW_MODE_READ_ONLY
|
||||
case "write":
|
||||
return appprovider.ViewMode_VIEW_MODE_READ_WRITE
|
||||
case "preview":
|
||||
return appprovider.ViewMode_VIEW_MODE_PREVIEW
|
||||
default:
|
||||
return appprovider.ViewMode_VIEW_MODE_INVALID
|
||||
}
|
||||
}
|
||||
|
||||
// AppendPlainToOpaque adds a new key value pair as a plain string on the given opaque and returns it
|
||||
func AppendPlainToOpaque(o *types.Opaque, key, value string) *types.Opaque {
|
||||
o = ensureOpaque(o)
|
||||
|
||||
Reference in New Issue
Block a user