code: func getPropertyName(expr ast.Expr, parser *Parser) propertyName {
  	if astTypeSelectorExpr, ok := expr.(*ast.SelectorExpr); ok {
  		return parseFieldSelectorExpr(astTypeSelectorExpr, parser, newProperty)
  	}
  
  	// check if it is a custom type
  	typeName := fmt.Sprintf("%v", expr)
  	if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[typeName]; isCustomType {
  		return propertyName{SchemaType: actualPrimitiveType, ArrayType: actualPrimitiveType}
  	}
  
  	if astTypeIdent, ok := expr.(*ast.Ident); ok {
  		name := astTypeIdent.Name
  		schemeType := TransToValidSchemeType(name)
  		return propertyName{SchemaType: schemeType, ArrayType: schemeType}
  	}
  
  	if ptr, ok := expr.(*ast.StarExpr); ok {
  		return getPropertyName(ptr.X, parser)
  	}
  
  	if astTypeArray, ok := expr.(*ast.ArrayType); ok { // if array
  		return getArrayPropertyName(astTypeArray, parser)
  	}
  
  	if _, ok := expr.(*ast.MapType); ok { // if map
  		//TODO: support map
  		return propertyName{SchemaType: "object", ArrayType: "object"}
  	}
  
  	if _, ok := expr.(*ast.StructType); ok { // if struct
  		return propertyName{SchemaType: "object", ArrayType: "object"}
  	}
  
  	if _, ok := expr.(*ast.InterfaceType); ok { // if interface{}
  		return propertyName{SchemaType: "object", ArrayType: "object"}
  	}
  
  	panic("not supported" + fmt.Sprint(expr))
  }
docs: // getPropertyName returns the string value for the given field if it exists, otherwise it panics.
  // allowedValues: array, boolean, integer, null, number, object, string