sobject/metadata.go (89 lines of code) (raw):

package sobject import ( "encoding/json" "fmt" "net/http" "github.com/elastic/go-sfdc" "github.com/elastic/go-sfdc/session" ) // MetadataValue is the response from the SObject metadata API. type MetadataValue struct { ObjectDescribe ObjectDescribe `json:"objectDescribe"` RecentItems []map[string]interface{} `json:"recentItems"` } // ObjectDescribe is the SObject metadata describe. type ObjectDescribe struct { Activatable bool `json:"activateable"` Creatable bool `json:"createable"` Custom bool `json:"custom"` CustomSetting bool `json:"customSetting"` Deletable bool `json:"deletable"` DeprecatedAndHidden bool `json:"deprecatedAndHidden"` FeedEnabled bool `json:"feedEnabled"` HasSubtype bool `json:"hasSubtypes"` IsSubtype bool `json:"isSubtype"` KeyPrefix string `json:"keyPrefix"` Label string `json:"label"` LabelPlural string `json:"labelPlural"` Layoutable bool `json:"layoutable"` Mergeable bool `json:"mergeable"` MruEnabled bool `json:"mruEnabled"` Name string `json:"name"` Queryable bool `json:"queryable"` Replicateable bool `json:"replicateable"` Retrieveable bool `json:"retrieveable"` Searchable bool `json:"searchable"` Triggerable bool `json:"triggerable"` Undeletable bool `json:"undeletable"` Updateable bool `json:"updateable"` URLs ObjectURLs `json:"urls"` } type metadata struct { session session.ServiceFormatter } func (md *metadata) callout(sobject string) (MetadataValue, error) { request, err := md.request(sobject) if err != nil { return MetadataValue{}, err } value, err := md.response(request) if err != nil { return MetadataValue{}, err } return value, nil } func (md *metadata) request(sobject string) (*http.Request, error) { url := md.session.ServiceURL() + objectEndpoint + sobject request, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return nil, err } request.Header.Add("Accept", "application/json") md.session.AuthorizationHeader(request) return request, nil } func (md *metadata) response(request *http.Request) (MetadataValue, error) { response, err := md.session.Client().Do(request) if err != nil { return MetadataValue{}, err } decoder := json.NewDecoder(response.Body) defer response.Body.Close() if response.StatusCode != http.StatusOK { var respErrs []sfdc.Error err = decoder.Decode(&respErrs) var errMsg error if err == nil { for _, respErr := range respErrs { errMsg = fmt.Errorf("metadata response err: %s: %s", respErr.ErrorCode, respErr.Message) } } else { errMsg = fmt.Errorf("metadata response err: %d %s", response.StatusCode, response.Status) } return MetadataValue{}, errMsg } var value MetadataValue err = decoder.Decode(&value) if err != nil { return MetadataValue{}, err } return value, nil }