code: func ExecuteActionsByChangeset(ctx context.Context, db application.DB, userID uuid.UUID, newContext change.Detector, contextChanges []change.Change, actionConfigs map[string]string) (change.Detector, change.Set, error) {
  	var actionChanges change.Set
  	for actionKey := range actionConfigs {
  		var err error
  		actionConfig := actionConfigs[actionKey]
  		switch actionKey {
  		case rules.ActionKeyNil:
  			newContext, actionChanges, err = executeAction(rules.ActionNil{}, actionConfig, newContext, contextChanges, &actionChanges)
  		case rules.ActionKeyFieldSet:
  			newContext, actionChanges, err = executeAction(rules.ActionFieldSet{
  				Db:     db,
  				Ctx:    ctx,
  				UserID: &userID,
  			}, actionConfig, newContext, contextChanges, &actionChanges)
  		/* commented out for now until this rule is added
  		case rules.ActionKeyStateToMetastate:
  			newContext, actionChanges, err = executeAction(rules.ActionStateToMetaState{
  				Db:     db,
  				Ctx:    ctx,
  				UserID: &userID,
  			}, actionConfig, newContext, contextChanges, &actionChanges)
  		*/
  		default:
  			return nil, nil, errs.New("action key " + actionKey + " is unknown")
  		}
  		if err != nil {
  			return nil, nil, err
  		}
  	}
  	return newContext, actionChanges, nil
  }
docs: // ExecuteActionsByChangeset executes all actions given in the actionConfigs
  // using the mapped configuration strings and returns the new context entity.
  // It takes a []Change that describes the differences between the old and the new context.