feat: implement caldav search
This commit is contained in:
78
vendor/github.com/dolanor/caldav-go/icalendar/reflect.go
generated
vendored
Normal file
78
vendor/github.com/dolanor/caldav-go/icalendar/reflect.go
generated
vendored
Normal file
@ -0,0 +1,78 @@
|
||||
package icalendar
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/dolanor/caldav-go/icalendar/properties"
|
||||
"github.com/dolanor/caldav-go/utils"
|
||||
"log"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var _ = log.Print
|
||||
|
||||
func isInvalidOrEmptyValue(v reflect.Value) bool {
|
||||
if !v.IsValid() {
|
||||
return true
|
||||
}
|
||||
switch v.Kind() {
|
||||
case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
|
||||
return v.Len() == 0
|
||||
case reflect.Bool:
|
||||
return !v.Bool()
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
return v.Int() == 0
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||
return v.Uint() == 0
|
||||
case reflect.Float32, reflect.Float64:
|
||||
return v.Float() == 0
|
||||
case reflect.Interface, reflect.Ptr:
|
||||
return v.IsNil()
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func newValue(in reflect.Value) (out reflect.Value, isArrayElement bool) {
|
||||
|
||||
typ := in.Type()
|
||||
kind := typ.Kind()
|
||||
|
||||
for {
|
||||
if kind == reflect.Array || kind == reflect.Slice {
|
||||
isArrayElement = true
|
||||
} else if kind != reflect.Ptr {
|
||||
break
|
||||
}
|
||||
typ = typ.Elem()
|
||||
kind = typ.Kind()
|
||||
}
|
||||
|
||||
out = reflect.New(typ)
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
func dereferencePointerValue(v reflect.Value) reflect.Value {
|
||||
for (v.Kind() == reflect.Interface || v.Kind() == reflect.Ptr) && v.Elem().IsValid() {
|
||||
v = v.Elem()
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func extractTagFromValue(v reflect.Value) (string, error) {
|
||||
|
||||
vdref := dereferencePointerValue(v)
|
||||
vtemp, _ := newValue(vdref)
|
||||
|
||||
if encoder, ok := vtemp.Interface().(properties.CanEncodeTag); ok {
|
||||
if tag, err := encoder.EncodeICalTag(); err != nil {
|
||||
return "", utils.NewError(extractTagFromValue, "unable to extract tag from interface", v.Interface(), err)
|
||||
} else {
|
||||
return strings.ToUpper(tag), nil
|
||||
}
|
||||
} else {
|
||||
typ := vtemp.Elem().Type()
|
||||
return strings.ToUpper(fmt.Sprintf("v%s", typ.Name())), nil
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user