package entity import ( "fmt" "reflect" "strings" ) type Name string func NameFromEntity(e any) Name { t := reflect.TypeOf(e) switch t.Kind() { case reflect.Ptr: return Name(fmt.Sprintf("%s/%s", t.Elem().PkgPath(), t.Elem().Name())) default: return Name(fmt.Sprintf("%s/%s", t.PkgPath(), t.Name())) } } func nameFromTag(tag string, parentName Name) Name { defined := Name(tag) if defined.IsShort() { return parentName.Combine(defined) } return defined } func (n Name) Short() string { path := strings.Split(string(n), "/") return path[len(path)-1] } func (n Name) IsShort() bool { return !strings.Contains(string(n), "/") } func (n Name) Equal(name Name) bool { return n == name } func (n Name) Combine(entity Name) Name { path := strings.Split(string(n), "/") return Name(strings.Join(append(path[:len(path)-1], entity.Short()), "/")) }