github.com/mhlo/force@v0.22.28-0.20150915022417-6d05ecfb0b47/bigobject.go (about) 1 package main 2 3 import ( 4 "bitbucket.org/pkg/inflect" 5 "fmt" 6 "os" 7 "strconv" 8 "strings" 9 ) 10 11 var cmdBigObject = &Command{ 12 Usage: "bigobject", 13 Short: "Manage big objects", 14 Long: ` 15 Manage big objects 16 17 Usage: 18 19 force bigobject list 20 21 force bigobject create <name> [<field>:<type> [<option>:<value>]] 22 23 force bigobject create -n=MyObject -l="My Object" -p="My Objects" \ 24 -f=name:Field1+label:"Field 1"+type:Text+length:120 \ 25 -f=name:MyDate+type=dateTime 26 27 Examples: 28 29 force bigobject list 30 31 force bigobject create Todo Description:string 32 33 `, 34 } 35 36 type boField []string 37 38 func (i *boField) String() string { 39 return fmt.Sprint(*i) 40 } 41 42 func (i *boField) Set(value string) error { 43 // That would permit usages such as 44 // -deltaT 10s -deltaT 15s 45 for _, name := range strings.Split(value, ",") { 46 *i = append(*i, name) 47 } 48 return nil 49 } 50 51 var ( 52 fields boField 53 deploymentStatus string 54 objectLabel string 55 pluralLabel string 56 ) 57 58 func init() { 59 cmdBigObject.Flag.Var(&fields, "field", "names of metadata") 60 cmdBigObject.Flag.Var(&fields, "f", "names of metadata") 61 cmdBigObject.Flag.StringVar(&deploymentStatus, "deployment", "Deployed", "deployment status") 62 cmdBigObject.Flag.StringVar(&deploymentStatus, "d", "Deployed", "deployment status") 63 cmdBigObject.Flag.StringVar(&objectLabel, "label", "", "big object label") 64 cmdBigObject.Flag.StringVar(&objectLabel, "l", "", "big object label") 65 cmdBigObject.Flag.StringVar(&pluralLabel, "plural", "", "big object plural label") 66 cmdBigObject.Flag.StringVar(&pluralLabel, "p", "", "big object plural label") 67 cmdBigObject.Run = runBigObject 68 } 69 70 func runBigObject(cmd *Command, args []string) { 71 if len(args) == 0 { 72 cmd.printUsage() 73 } else { 74 if err := cmd.Flag.Parse(args[1:]); err != nil { 75 os.Exit(2) 76 } 77 switch args[0] { 78 case "list": 79 getBigObjectList(args[1:]) 80 case "create": 81 runBigObjectCreate(args[1:]) 82 default: 83 ErrorAndExit("no such command: %s", args[0]) 84 } 85 } 86 } 87 88 func parseField(fielddata string) (result BigObjectField) { 89 attrs := strings.Split(fielddata, "+") 90 for _, data := range attrs { 91 pair := strings.Split(data, ":") 92 switch strings.ToLower(pair[0]) { 93 case "fullname", "name": 94 result.FullName = pair[1] 95 case "label": 96 result.Label = pair[1] 97 case "type": 98 result.Type = pair[1] 99 case "referenceto": 100 result.ReferenceTo = pair[1] 101 case "relationshipname": 102 result.RelationshipName = pair[1] 103 case "length": 104 var lval int64 105 lval, err := strconv.ParseInt(pair[1], 10, 0) 106 if err != nil { 107 ErrorAndExit(err.Error()) 108 } 109 result.Length = int(lval) 110 } 111 } 112 result = validateField(result) 113 return 114 } 115 116 func validateField(originField BigObjectField) (field BigObjectField) { 117 field = originField 118 if len(field.Type) == 0 { 119 ErrorAndExit("You need to indicate the type for field %s", field.FullName) 120 } 121 if len(field.Label) == 0 { 122 field.Label = field.FullName 123 } 124 switch strings.ToLower(field.Type) { 125 case "text": 126 if field.Length == 0 { 127 ErrorAndExit("The text field %s is missing the length attribute.", field.FullName) 128 } 129 field.ReferenceTo = "" 130 field.RelationshipName = "" 131 case "lookup": 132 if len(field.ReferenceTo) == 0 { 133 ErrorAndExit("The lookup field %s is missing the referenceTo attribute.", field.FullName) 134 } 135 if len(field.RelationshipName) == 0 { 136 ErrorAndExit("The lookup field %s is missing the relationshipName attribute.") 137 } 138 case "datetime": 139 field.ReferenceTo = "" 140 field.RelationshipName = "" 141 field.Length = 0 142 default: 143 ErrorAndExit("%s is not a valid field type.\nValid field types are 'text', 'dateTime' and 'lookup'", field.Type) 144 } 145 return 146 } 147 148 func getBigObjectList(args []string) (l []ForceSobject) { 149 force, _ := ActiveForce() 150 sobjects, err := force.ListSobjects() 151 if err != nil { 152 ErrorAndExit(fmt.Sprintf("ERROR: %s\n", err)) 153 } 154 155 for _, sobject := range sobjects { 156 if len(args) == 1 { 157 if strings.Contains(sobject["name"].(string), args[0]) { 158 l = append(l, sobject) 159 } 160 } else { 161 l = append(l, sobject) 162 } 163 } 164 return 165 } 166 167 func runBigObjectCreate(args []string) { 168 var fieldObjects = make([]BigObjectField, len(fields)) 169 for i, field := range fields { 170 fieldObjects[i] = parseField(field) 171 } 172 173 var object = BigObject{deploymentStatus, objectLabel, pluralLabel, fieldObjects} 174 if len(object.Label) == 0 { 175 ErrorAndExit("Please provide a label for your big object using the -l flag.") 176 } 177 if len(object.PluralLabel) == 0 { 178 object.PluralLabel = inflect.Pluralize(object.Label) 179 } 180 force, _ := ActiveForce() 181 if err := force.Metadata.CreateBigObject(object); err != nil { 182 ErrorAndExit(err.Error()) 183 } 184 fmt.Println("Big object created") 185 186 }