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  }