sobject/tree/builder.go (51 lines of code) (raw):
package tree
import (
"errors"
"fmt"
"regexp"
"github.com/elastic/go-sfdc/sobject"
)
// Builder is the SObject Tree builder for the
// composite SObject Tree API.
type Builder interface {
sobject.Inserter
ReferenceID() string
}
// RecordBuilder is record builder for the
// composite SObject Tree API.
type RecordBuilder struct {
record Record
}
// NewRecordBuilder will create a new builder. If the SObject is
// not value or the reference ID is empyt, an error will be returned.
func NewRecordBuilder(builder Builder) (*RecordBuilder, error) {
if builder == nil {
return nil, errors.New("sobject tree: the builder can not be nil")
}
sobject := builder.SObject()
matching, err := regexp.MatchString(`\w`, sobject)
if err != nil {
return nil, err
}
if matching == false {
return nil, fmt.Errorf("tree builder: %s is not a valid sobject", sobject)
}
if builder.ReferenceID() == "" {
return nil, errors.New("tree builder: reference id must be present")
}
return &RecordBuilder{
record: Record{
Attributes: Attributes{
Type: sobject,
ReferenceID: builder.ReferenceID(),
},
Fields: builder.Fields(),
Records: make(map[string][]*Record),
},
}, nil
}
// SubRecords will add subrecords to the object.
func (rb *RecordBuilder) SubRecords(sobjects string, records ...*Record) {
var subRecords []*Record
if subRec, ok := rb.record.Records[sobjects]; ok {
subRecords = subRec
}
subRecords = append(subRecords, records...)
rb.record.Records[sobjects] = subRecords
}
// Build will create the composite tree record.
func (rb *RecordBuilder) Build() *Record {
return &rb.record
}