| // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later |
| |
| package convert |
| |
| import ( |
| "fmt" |
| "reflect" |
| |
| "github.com/spdx/tools-golang/spdx/common" |
| ) |
| |
| // FromPtr accepts a document or a document pointer and returns the direct struct reference |
| func FromPtr(doc common.AnyDocument) common.AnyDocument { |
| value := reflect.ValueOf(doc) |
| for value.Type().Kind() == reflect.Ptr { |
| value = value.Elem() |
| } |
| return value.Interface() |
| } |
| |
| func IsPtr(obj common.AnyDocument) bool { |
| t := reflect.TypeOf(obj) |
| if t.Kind() == reflect.Interface { |
| t = t.Elem() |
| } |
| return t.Kind() == reflect.Ptr |
| } |
| |
| func Describe(o interface{}) string { |
| value := reflect.ValueOf(o) |
| typ := value.Type() |
| prefix := "" |
| for typ.Kind() == reflect.Ptr { |
| prefix += "*" |
| value = value.Elem() |
| typ = value.Type() |
| } |
| str := limit(fmt.Sprintf("%+v", value.Interface()), 300) |
| name := fmt.Sprintf("%s.%s%s", typ.PkgPath(), prefix, typ.Name()) |
| return fmt.Sprintf("%s: %s", name, str) |
| } |
| |
| func limit(text string, length int) string { |
| if length <= 0 || len(text) <= length+3 { |
| return text |
| } |
| r := []rune(text) |
| r = r[:length] |
| return string(r) + "..." |
| } |