Initial QSfera import

This commit is contained in:
Курнат Андрей
2026-06-07 10:20:04 +03:00
commit 2315f25754
16485 changed files with 4826827 additions and 0 deletions
+24
View File
@@ -0,0 +1,24 @@
package conversions
import (
"encoding/json"
)
func To[T any](v any) (T, error) {
var t T
if v == nil {
return t, nil
}
j, err := json.Marshal(v)
if err != nil {
return t, err
}
if err := json.Unmarshal(j, &t); err != nil {
return t, err
}
return t, nil
}
+38
View File
@@ -0,0 +1,38 @@
package conversions
// ToPointer converts a value to a pointer
func ToPointer[T any](val T) *T {
return &val
}
// ToValue converts a pointer to a value
func ToValue[T any](ptr *T) T {
if ptr == nil {
var t T
return t
}
return *ptr
}
// ToPointerSlice converts a slice of values to a slice of pointers
func ToPointerSlice[E any](s []E) []*E {
rs := make([]*E, len(s))
for i, v := range s {
rs[i] = ToPointer(v)
}
return rs
}
// ToValueSlice converts a slice of pointers to a slice of values
func ToValueSlice[E any](s []*E) []E {
rs := make([]E, len(s))
for i, v := range s {
rs[i] = ToValue(v)
}
return rs
}
+113
View File
@@ -0,0 +1,113 @@
package conversions_test
import (
"fmt"
"testing"
libregraph "github.com/opencloud-eu/libre-graph-api-go"
"github.com/qsfera/server/pkg/conversions"
)
func checkIdentical[T any](t *testing.T, p T, want string) {
t.Helper()
got := fmt.Sprintf("%T", p)
if got != want {
t.Errorf("want:%q got:%q", want, got)
}
}
func TestToPointer2(t *testing.T) {
checkIdentical(t, conversions.ToPointer("a"), "*string")
checkIdentical(t, conversions.ToPointer(1), "*int")
checkIdentical(t, conversions.ToPointer(-1), "*int")
checkIdentical(t, conversions.ToPointer(float64(1)), "*float64")
checkIdentical(t, conversions.ToPointer(float64(-1)), "*float64")
checkIdentical(t, conversions.ToPointer(libregraph.UnifiedRoleDefinition{}), "*libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToPointer([]string{"a"}), "*[]string")
checkIdentical(t, conversions.ToPointer([]int{1}), "*[]int")
checkIdentical(t, conversions.ToPointer([]float64{1}), "*[]float64")
checkIdentical(t, conversions.ToPointer([]libregraph.UnifiedRoleDefinition{{}}), "*[]libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToPointer(conversions.ToPointer("a")), "**string")
checkIdentical(t, conversions.ToPointer(conversions.ToPointer(1)), "**int")
checkIdentical(t, conversions.ToPointer(conversions.ToPointer(-1)), "**int")
checkIdentical(t, conversions.ToPointer(conversions.ToPointer(float64(1))), "**float64")
checkIdentical(t, conversions.ToPointer(conversions.ToPointer(float64(-1))), "**float64")
checkIdentical(t, conversions.ToPointer(conversions.ToPointer(libregraph.UnifiedRoleDefinition{})), "**libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToPointer(conversions.ToPointer([]string{"a"})), "**[]string")
checkIdentical(t, conversions.ToPointer(conversions.ToPointer([]int{1})), "**[]int")
checkIdentical(t, conversions.ToPointer(conversions.ToPointer([]float64{1})), "**[]float64")
checkIdentical(t, conversions.ToPointer(conversions.ToPointer([]libregraph.UnifiedRoleDefinition{{}})), "**[]libregraph.UnifiedRoleDefinition")
}
func TestToValue(t *testing.T) {
checkIdentical(t, conversions.ToValue((*int)(nil)), "int")
checkIdentical(t, conversions.ToValue((*string)(nil)), "string")
checkIdentical(t, conversions.ToValue((*float64)(nil)), "float64")
checkIdentical(t, conversions.ToValue((*libregraph.UnifiedRoleDefinition)(nil)), "libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToValue((*[]string)(nil)), "[]string")
checkIdentical(t, conversions.ToValue((*[]libregraph.UnifiedRoleDefinition)(nil)), "[]libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToValue(conversions.ToPointer("a")), "string")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(1)), "int")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(-1)), "int")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(float64(1))), "float64")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(float64(-1))), "float64")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(libregraph.UnifiedRoleDefinition{})), "libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToValue(conversions.ToPointer([]string{"a"})), "[]string")
checkIdentical(t, conversions.ToValue(conversions.ToPointer([]int{1})), "[]int")
checkIdentical(t, conversions.ToValue(conversions.ToPointer([]float64{1})), "[]float64")
checkIdentical(t, conversions.ToValue(conversions.ToPointer([]libregraph.UnifiedRoleDefinition{{}})), "[]libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(conversions.ToPointer("a"))), "*string")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(conversions.ToPointer(1))), "*int")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(conversions.ToPointer(-1))), "*int")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(conversions.ToPointer(float64(1)))), "*float64")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(conversions.ToPointer(float64(-1)))), "*float64")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(conversions.ToPointer(libregraph.UnifiedRoleDefinition{}))), "*libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(conversions.ToPointer([]string{"a"}))), "*[]string")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(conversions.ToPointer([]int{1}))), "*[]int")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(conversions.ToPointer([]float64{1}))), "*[]float64")
checkIdentical(t, conversions.ToValue(conversions.ToPointer(conversions.ToPointer([]libregraph.UnifiedRoleDefinition{{}}))), "*[]libregraph.UnifiedRoleDefinition")
}
func TestToPointerSlice(t *testing.T) {
checkIdentical(t, conversions.ToPointerSlice([]string{"a"}), "[]*string")
checkIdentical(t, conversions.ToPointerSlice([]int{1}), "[]*int")
checkIdentical(t, conversions.ToPointerSlice([]libregraph.UnifiedRoleDefinition{{}}), "[]*libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToPointerSlice(([]string)(nil)), "[]*string")
checkIdentical(t, conversions.ToPointerSlice(([]int)(nil)), "[]*int")
checkIdentical(t, conversions.ToPointerSlice(([]libregraph.UnifiedRoleDefinition)(nil)), "[]*libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToPointerSlice([]*string{conversions.ToPointer("a")}), "[]**string")
checkIdentical(t, conversions.ToPointerSlice([]*int{conversions.ToPointer(1)}), "[]**int")
checkIdentical(t, conversions.ToPointerSlice(([]*libregraph.UnifiedRoleDefinition)(nil)), "[]**libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToPointerSlice(([]*string)(nil)), "[]**string")
checkIdentical(t, conversions.ToPointerSlice(([]*int)(nil)), "[]**int")
checkIdentical(t, conversions.ToPointerSlice(([]*libregraph.UnifiedRoleDefinition)(nil)), "[]**libregraph.UnifiedRoleDefinition")
}
func TestToValueSlice(t *testing.T) {
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice([]string{"a"})), "[]string")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice([]int{1})), "[]int")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice([]libregraph.UnifiedRoleDefinition{{}})), "[]libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice(([]string)(nil))), "[]string")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice(([]int)(nil))), "[]int")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice(([]libregraph.UnifiedRoleDefinition)(nil))), "[]libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice([]*string{conversions.ToPointer("a")})), "[]*string")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice([]*int{conversions.ToPointer(1)})), "[]*int")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice([]*libregraph.UnifiedRoleDefinition{conversions.ToPointer(libregraph.UnifiedRoleDefinition{})})), "[]*libregraph.UnifiedRoleDefinition")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice(([]*string)(nil))), "[]*string")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice(([]*int)(nil))), "[]*int")
checkIdentical(t, conversions.ToValueSlice(conversions.ToPointerSlice(([]*libregraph.UnifiedRoleDefinition)(nil))), "[]*libregraph.UnifiedRoleDefinition")
}
+16
View File
@@ -0,0 +1,16 @@
package conversions
import (
"strings"
)
// StringToSliceString splits a string into a slice string according to separator
func StringToSliceString(src string, sep string) []string {
parsed := strings.Split(src, sep)
parts := make([]string, 0, len(parsed))
for _, v := range parsed {
parts = append(parts, strings.TrimSpace(v))
}
return parts
}
+35
View File
@@ -0,0 +1,35 @@
package conversions
import "testing"
var scenarios = []struct {
name string
input string
separator string
out []string
}{
{
"comma separated input",
"a, b, c, d",
",",
[]string{"a", "b", "c", "d"},
}, {
"space separated input",
"a b c d",
" ",
[]string{"a", "b", "c", "d"},
},
}
func TestStringToSliceString(t *testing.T) {
for _, tt := range scenarios {
t.Run(tt.name, func(t *testing.T) {
s := StringToSliceString(tt.input, tt.separator)
for i, v := range tt.out {
if s[i] != v {
t.Errorf("got %q, want %q", s, tt.out)
}
}
})
}
}