package mdbc import ( "context" "gitter.top/common/goref" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo/options" ) type insertScope struct { scope *scope mdbc *mdbc ctx context.Context opts any docs any } type insert interface { insert(docs any) (*InsertResult, error) } type insertOne struct { *insertScope } func (io *insertOne) insert(docs any) (*InsertResult, error) { result, err := io.mdbc.database.Collection(io.scope.tableName).InsertOne(io.ctx, docs, io.opts.(*options.InsertOneOptions)) if err != nil { return nil, err } return &InsertResult{id: result.InsertedID}, nil } type insertMany struct { *insertScope } func (im *insertMany) insert(docs any) (*InsertResult, error) { vals, ok := goref.ToInterfaces(docs) if !ok { return nil, ErrorNoInsertDocuments } result, err := im.mdbc.database.Collection(im.scope.tableName).InsertMany(im.ctx, vals, im.opts.(*options.InsertManyOptions)) if err != nil { return nil, err } return &InsertResult{id: result.InsertedIDs}, nil } type InsertResult struct { id interface{} } func (ir *InsertResult) GetID() string { objectID, ok := ir.id.(primitive.ObjectID) if ok { return objectID.Hex() } val, ok := goref.ToString(ir.id) if !ok { panic("get insert id failed") } return val } func (ir *InsertResult) GetIDs() []string { vals, ok := goref.ToStrings(ir.id) if !ok { panic("get insert id failed") } return vals } func (is *insertScope) SetContext(ctx context.Context) *insertScope { is.ctx = ctx return is } func (is *insertScope) SetInsertOneOptions(opts options.InsertOneOptions) *insertScope { is.opts = &opts return is } func (is *insertScope) SetInsertManyOptions(opts options.InsertManyOptions) *insertScope { is.opts = &opts return is } func (is *insertScope) mergeOptions(isMany bool) *insertScope { if is.ctx == nil { is.ctx = context.Background() } if is.opts == nil && isMany { is.opts = &options.InsertManyOptions{} } if is.opts == nil && !isMany { is.opts = &options.InsertOneOptions{} } return is } func (is *insertScope) Insert(docs any) (*InsertResult, error) { isMany := goref.IsBaseList(docs) is.mergeOptions(isMany) var action insert = &insertOne{is} if isMany { action = &insertMany{is} } return action.insert(docs) }