package orm import ( "context" "reflect" ) type hookStubs struct{} func (hookStubs) AfterQuery(_ context.Context, _ DB) error { return nil } func (hookStubs) BeforeSelectQuery(_ context.Context, db DB, q *Query) (*Query, error) { return q, nil } func (hookStubs) AfterSelect(_ context.Context, _ DB) error { return nil } func (hookStubs) BeforeInsert(_ context.Context, _ DB) error { return nil } func (hookStubs) AfterInsert(_ context.Context, _ DB) error { return nil } func (hookStubs) BeforeUpdate(_ context.Context, _ DB) error { return nil } func (hookStubs) AfterUpdate(_ context.Context, _ DB) error { return nil } func (hookStubs) BeforeDelete(_ context.Context, _ DB) error { return nil } func (hookStubs) AfterDelete(_ context.Context, _ DB) error { return nil } func callHookSlice( slice reflect.Value, ptr bool, c context.Context, db DB, hook func(reflect.Value, context.Context, DB) error, ) error { var firstErr error for i := 0; i < slice.Len(); i++ { v := slice.Index(i) if !ptr { v = v.Addr() } err := hook(v, c, db) if err != nil && firstErr == nil { firstErr = err } } return firstErr } //------------------------------------------------------------------------------ type oldAfterQueryHook interface { AfterQuery(DB) error } var oldAfterQueryHookType = reflect.TypeOf((*oldAfterQueryHook)(nil)).Elem() type afterQueryHook interface { AfterQuery(context.Context, DB) error } var afterQueryHookType = reflect.TypeOf((*afterQueryHook)(nil)).Elem() func callAfterQueryHook(v reflect.Value, c context.Context, db DB) error { return v.Interface().(afterQueryHook).AfterQuery(c, db) } func callAfterQueryHookSlice(slice reflect.Value, ptr bool, c context.Context, db DB) error { return callHookSlice(slice, ptr, c, db, callAfterQueryHook) } //------------------------------------------------------------------------------ type oldBeforeSelectQueryHook interface { BeforeSelectQuery(DB, *Query) (*Query, error) } var oldBeforeSelectQueryHookType = reflect.TypeOf((*oldBeforeSelectQueryHook)(nil)).Elem() type beforeSelectQueryHook interface { BeforeSelectQuery(context.Context, DB, *Query) (*Query, error) } var beforeSelectQueryHookType = reflect.TypeOf((*beforeSelectQueryHook)(nil)).Elem() func callBeforeSelectQueryHook(v reflect.Value, c context.Context, db DB, q *Query) (*Query, error) { return v.Interface().(beforeSelectQueryHook).BeforeSelectQuery(c, db, q) } //------------------------------------------------------------------------------ type oldAfterSelectHook interface { AfterSelect(DB) error } var oldAfterSelectHookType = reflect.TypeOf((*oldAfterSelectHook)(nil)).Elem() type afterSelectHook interface { AfterSelect(context.Context, DB) error } var afterSelectHookType = reflect.TypeOf((*afterSelectHook)(nil)).Elem() func callAfterSelectHook(v reflect.Value, c context.Context, db DB) error { return v.Interface().(afterSelectHook).AfterSelect(c, db) } func callAfterSelectHookSlice(slice reflect.Value, ptr bool, c context.Context, db DB) error { return callHookSlice(slice, ptr, c, db, callAfterSelectHook) } //------------------------------------------------------------------------------ type oldBeforeInsertHook interface { BeforeInsert(DB) error } var oldBeforeInsertHookType = reflect.TypeOf((*oldBeforeInsertHook)(nil)).Elem() type beforeInsertHook interface { BeforeInsert(context.Context, DB) error } var beforeInsertHookType = reflect.TypeOf((*beforeInsertHook)(nil)).Elem() func callBeforeInsertHook(v reflect.Value, c context.Context, db DB) error { return v.Interface().(beforeInsertHook).BeforeInsert(c, db) } func callBeforeInsertHookSlice(slice reflect.Value, ptr bool, c context.Context, db DB) error { return callHookSlice(slice, ptr, c, db, callBeforeInsertHook) } //------------------------------------------------------------------------------ type oldAfterInsertHook interface { AfterInsert(DB) error } var oldAfterInsertHookType = reflect.TypeOf((*oldAfterInsertHook)(nil)).Elem() type afterInsertHook interface { AfterInsert(context.Context, DB) error } var afterInsertHookType = reflect.TypeOf((*afterInsertHook)(nil)).Elem() func callAfterInsertHook(v reflect.Value, c context.Context, db DB) error { return v.Interface().(afterInsertHook).AfterInsert(c, db) } func callAfterInsertHookSlice(slice reflect.Value, ptr bool, c context.Context, db DB) error { return callHookSlice(slice, ptr, c, db, callAfterInsertHook) } //------------------------------------------------------------------------------ type oldBeforeUpdateHook interface { BeforeUpdate(DB) error } var oldBeforeUpdateHookType = reflect.TypeOf((*oldBeforeUpdateHook)(nil)).Elem() type beforeUpdateHook interface { BeforeUpdate(context.Context, DB) error } var beforeUpdateHookType = reflect.TypeOf((*beforeUpdateHook)(nil)).Elem() func callBeforeUpdateHook(v reflect.Value, c context.Context, db DB) error { return v.Interface().(beforeUpdateHook).BeforeUpdate(c, db) } func callBeforeUpdateHookSlice(slice reflect.Value, ptr bool, c context.Context, db DB) error { return callHookSlice(slice, ptr, c, db, callBeforeUpdateHook) } //------------------------------------------------------------------------------ type oldAfterUpdateHook interface { AfterUpdate(DB) error } var oldAfterUpdateHookType = reflect.TypeOf((*oldAfterUpdateHook)(nil)).Elem() type afterUpdateHook interface { AfterUpdate(context.Context, DB) error } var afterUpdateHookType = reflect.TypeOf((*afterUpdateHook)(nil)).Elem() func callAfterUpdateHook(v reflect.Value, c context.Context, db DB) error { return v.Interface().(afterUpdateHook).AfterUpdate(c, db) } func callAfterUpdateHookSlice(slice reflect.Value, ptr bool, c context.Context, db DB) error { return callHookSlice(slice, ptr, c, db, callAfterUpdateHook) } //------------------------------------------------------------------------------ type oldBeforeDeleteHook interface { BeforeDelete(DB) error } var oldBeforeDeleteHookType = reflect.TypeOf((*oldBeforeDeleteHook)(nil)).Elem() type beforeDeleteHook interface { BeforeDelete(context.Context, DB) error } var beforeDeleteHookType = reflect.TypeOf((*beforeDeleteHook)(nil)).Elem() func callBeforeDeleteHook(v reflect.Value, c context.Context, db DB) error { return v.Interface().(beforeDeleteHook).BeforeDelete(c, db) } func callBeforeDeleteHookSlice(slice reflect.Value, ptr bool, c context.Context, db DB) error { return callHookSlice(slice, ptr, c, db, callBeforeDeleteHook) } //------------------------------------------------------------------------------ type oldAfterDeleteHook interface { AfterDelete(DB) error } var oldAfterDeleteHookType = reflect.TypeOf((*oldAfterDeleteHook)(nil)).Elem() type afterDeleteHook interface { AfterDelete(context.Context, DB) error } var afterDeleteHookType = reflect.TypeOf((*afterDeleteHook)(nil)).Elem() func callAfterDeleteHook(v reflect.Value, c context.Context, db DB) error { return v.Interface().(afterDeleteHook).AfterDelete(c, db) } func callAfterDeleteHookSlice(slice reflect.Value, ptr bool, c context.Context, db DB) error { return callHookSlice(slice, ptr, c, db, callAfterDeleteHook) }